Javascript关闭不提供预期的结果

时间:2016-07-21 09:24:28

标签: javascript closures

我想了解闭包。

var a = 1;

var g = function () {
  var a = a;
  return function() {
    console.log(a);
  }
}

g()();

据我所知,函数调用g()()应该记录a的值,即1.但是它在控制台上记录undefined。我知道我的概念在某个地方很弱,但即使花了几个小时也无法弄明白。有人可以帮忙吗?

2 个答案:

答案 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