Javascript闭包未提供预期结果

Javascript Closure not providing expected result

本文关键字:结果 闭包 Javascript      更新时间:2023-09-26

我正在努力理解闭包。

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

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

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

有关变量吊装的更多信息,请查看本文。

问题是线路

var a = a;

这既是声明一个局部作用域的变量,又将其分配给自己——它不与全局a交互。您需要使用一个不同名称的本地变量:

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