JS闭包-x的值是多少?

时间:2018-07-25 01:14:15

标签: javascript scope closures

这是一个思想练习。我对这段代码没有做任何事情,目的是更好地了解闭包是如何工作的。

思考过程:

  1. x ===全局范围内的10。
  2. outer()函数被调用。
  3. x ===全局范围和局部范围中的20。
  4. inner()函数被调用。
  5. 表示“ var x”的右侧。
  6. 在x + 20中,因为x不在本地范围内定义,所以它搜索外部范围并找到x === 20。
  7. x = 20 + 20。
  8. var x === 40。
  9. 返回x。
  10. 结果=== 40。

但是,答案是20。为什么?

Range("I1044")

2 个答案:

答案 0 :(得分:1)

调用inner()函数时,第一件事是var x

这意味着JavaScript解释器首先创建一个名为x的变量,并为其分配undefined

然后,它运行赋值表达式x + 20,它等效于undefined + 20,即NaN

您的变量resultinner()函数无关,因为您有一个局部变量(由于该var x),并且您忽略了返回的结果。

换句话说,您的代码等效于此:

var x = 10;

function outer () {
  x = 20;
}

outer();

var result = x;

答案 1 :(得分:0)

因为内部函数定义了局部var x,它将在外部隐藏全局变量。并且外部函数使用全局变量x并将其分配给20。显然,全局x为20。在调用原型链中的函数之前,JavaScript将定义每个局部变量。

var x = 10;
function outer () {
  x = 20;
  function inner () {
    alert(x); // alert undefined
    var x = x + 20;
    return x;
  }
  inner();
}
outer();
var result = x;