var name = "global";
function testName() {
alert(name);
var name = "local";
alert(name);
}
testName();
这样调用时 第一个alert是undefined
var outerName = "漠漠";
function outerFn() {
alert(outerName);
var name = "大漠穷秋";
function innerFn() {
alert("[" + outerName + "、" + name + "]一枝红杏出墙来。");
}
return innerFn;
}
var cache = outerFn();
cache();
两个alert都能正常输出,这儿变量的作用域都一样,为什么会出现这种情况
function作用域

解决方案 »

  1.   

    var name = "global";
    function testName() {
    alert(name);
    var name = "local";

    alert(name);
    }
    testName();等价下面的var name = "global";
    function testName() {
    var name;
    alert(name);
    name = "local";

    alert(name);
    }
    testName();
      

  2.   

    楼上的解释太笼统了,那这个
    var outerName = "漠漠";
    function outerFn() {
    alert(outerName);
    var name = "大漠穷秋";
    function innerFn() {
    alert("[" + outerName + "、" + name + "]一枝红杏出墙来。");
    }
    return innerFn;
    }
    var cache = outerFn();
    cache();
    又怎么解释???
      

  3.   


    var name = "global";
    function testName() {
    alert(name);   //输出undefined,是因为函数内部定义了name的值屏蔽了函数外面全局变量的值,但这时还没有给它赋值,所以输出为undefined
    var name = "local";
    alert(name);
    }
    testName();//如果改成以下:
    var name = "global";
    function test() {
    alert(name);   //输出global,是因为在函数内部如果没有定义该变量,就可以直接读取全局变量
    }
    test();
    var outerName = "漠漠";
    function outerFn() {
    alert(outerName);  //输出漠漠,是因为函数内部没有定义outerName的值,所以直接读取外部函数全局变量的值,如果改为name,照样输出undefined
    var name = "大漠穷秋";
    function innerFn() {  //这是一个闭包函数,在这里可以读取到outerFn里面的name的值
    alert("[" + outerName + "、" + name + "]一枝红杏出墙来。");
    }
    return innerFn;
    }
    //闭包就是能够读取其他函数内部变量的函数
    var cache = outerFn();
    cache(); //输出[漠漠、大漠穷秋]一枝红杏出墙来。介意楼主多去看下js的作用域问题和什么是闭包函数,基本就可以明白了~
      

  4.   

    楼上几位基本都解释了,js中没有scope的概念(也就是你在if条件中定义了一个变量,在if条件外扔可以访问,但像C#或者java语言就不行),所以在js的function中,建议将所有变量的定义都提到function的最开头,即使你不这么做,程序执行的时候也会自动将所有变量都提到作用域的最前面,但变量的赋值就在你写赋值的地方进行,所以第一个例子中var name = "local",实际是把var name=“undefined”放在函数最开始执行,所以覆盖了全局变量,而name = "local"赋值操作就在这句执行
      

  5.   

    js先加载var变量。所以建议把所有变量定义写在function内的第一行。
      

  6.   

    var name = "global";
    function testName() {
    alert(name);
    var name = "local";
    alert(name);
    }
    testName();相当于
    var name = "global";
    function testName() {
    var name=undefined;
    alert(name);
    name = "local";
    alert(name);
    }
    testName();
    这样调用时 第一个alert是undefined,是函数作用域中的name;