日期:2014-05-16  浏览次数:20363 次

js中变量的作用域问题
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 作用域

------解决方案--------------------

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