js中变量的作用域问题

时间:2022-02-28 18:02:37
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都能正常输出,这儿变量的作用域都一样,为什么会出现这种情况

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();

#2


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

#3


变量的定义分为两步,先申明后赋值。

方法中的变量申明都会提前到最前面。但是赋值还是在那个位置。

所以就和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();

相当于
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();

#2


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

#3


变量的定义分为两步,先申明后赋值。

方法中的变量申明都会提前到最前面。但是赋值还是在那个位置。

所以就和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();

相当于
var name = "global";
function testName() {
var name=undefined;
alert(name);
name = "local";
alert(name);
}
testName();

这样调用时 第一个alert是undefined,是函数作用域中的name;