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都能正常输出,这儿变量的作用域都一样,为什么会出现这种情况
9 个解决方案
#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();
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();
又怎么解释???
var outerName = "漠漠";
function outerFn() {
alert(outerName);
var name = "大漠穷秋";
function innerFn() {
alert("[" + outerName + "、" + name + "]一枝红杏出墙来。");
}
return innerFn;
}
var cache = outerFn();
cache();
又怎么解释???
#3
变量的定义分为两步,先申明后赋值。
方法中的变量申明都会提前到最前面。但是赋值还是在那个位置。
所以就和2L说的那个样子一样了。
方法中的变量申明都会提前到最前面。但是赋值还是在那个位置。
所以就和2L说的那个样子一样了。
#4
记住同一片作用域相同的变量名就是同一个变量,就明白了
#5
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的作用域问题和什么是闭包函数,基本就可以明白了~
#6
楼上几位基本都解释了,js中没有scope的概念(也就是你在if条件中定义了一个变量,在if条件外扔可以访问,但像C#或者java语言就不行),所以在js的function中,建议将所有变量的定义都提到function的最开头,即使你不这么做,程序执行的时候也会自动将所有变量都提到作用域的最前面,但变量的赋值就在你写赋值的地方进行,所以第一个例子中var name = "local",实际是把var name=“undefined”放在函数最开始执行,所以覆盖了全局变量,而name = "local"赋值操作就在这句执行
#7
js先加载var变量。所以建议把所有变量定义写在function内的第一行。
#8
学习了,看了大家的解释!
#9
var name = "global";
function testName() {
alert(name);
var name = "local";
alert(name);
}
testName();
相当于
这样调用时 第一个alert是undefined,是函数作用域中的name;
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;
#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();
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();
又怎么解释???
var outerName = "漠漠";
function outerFn() {
alert(outerName);
var name = "大漠穷秋";
function innerFn() {
alert("[" + outerName + "、" + name + "]一枝红杏出墙来。");
}
return innerFn;
}
var cache = outerFn();
cache();
又怎么解释???
#3
变量的定义分为两步,先申明后赋值。
方法中的变量申明都会提前到最前面。但是赋值还是在那个位置。
所以就和2L说的那个样子一样了。
方法中的变量申明都会提前到最前面。但是赋值还是在那个位置。
所以就和2L说的那个样子一样了。
#4
记住同一片作用域相同的变量名就是同一个变量,就明白了
#5
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的作用域问题和什么是闭包函数,基本就可以明白了~
#6
楼上几位基本都解释了,js中没有scope的概念(也就是你在if条件中定义了一个变量,在if条件外扔可以访问,但像C#或者java语言就不行),所以在js的function中,建议将所有变量的定义都提到function的最开头,即使你不这么做,程序执行的时候也会自动将所有变量都提到作用域的最前面,但变量的赋值就在你写赋值的地方进行,所以第一个例子中var name = "local",实际是把var name=“undefined”放在函数最开始执行,所以覆盖了全局变量,而name = "local"赋值操作就在这句执行
#7
js先加载var变量。所以建议把所有变量定义写在function内的第一行。
#8
学习了,看了大家的解释!
#9
var name = "global";
function testName() {
alert(name);
var name = "local";
alert(name);
}
testName();
相当于
这样调用时 第一个alert是undefined,是函数作用域中的name;
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;