我想了解闭包。
var a = 1;
var g = function () {
var a = a;
return function() {
console.log(a);
}
}
g()();
据我所知,函数调用g()()
应该记录a的值,即1.但是它在控制台上记录undefined
。我知道我的概念在某个地方很弱,但即使花了几个小时也无法弄明白。有人可以帮忙吗?
答案 0 :(得分:1)
问题在于
行var a = a;
这是声明一个本地范围的变量并将其分配给自己 - 它没有与全局a
交互。您需要使用不同名称的局部变量:
var a = 1;
var g = function() {
var b = a;
return function() {
console.log(b);
}
}
g()();

答案 1 :(得分:1)
JavaScript在整个函数范围内提升var
声明。外部范围var a = 1
中的变量将被覆盖
这个例子相当于:
var a = 1;
var g = function () {
var a; // a is undefined
a = a; // a = undefined
return function() {
console.log(a);
}
}
g()();
如果没有初始值分配,a
只是undefined
。稍后您将变量分配给自己a = a
,这是一个noop而a
仍为undefined
。
有关变量提升的更多信息,请check this article。