【问题标题】:JS Closures - What is the value of x?JS 闭包 - x 的值是多少?
【发布时间】:2019-01-01 17:18:53
【问题描述】:

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

思考过程:

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

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

var x = 10;

function outer () {
  x = 20;
  function inner () {
    var x = x + 20;
    return x;
  }
  inner();
}

outer();

var result = x;

【问题讨论】:

  • 6. In x + 20, because x is not defined in local scope, it searches outer scope 这是错误的。
  • @vol7ron vars 被提升 - 当尝试分配时它确实在本地存在(值为undefined)。
  • @CertainPerformance 你说得对。让我举例说明为什么您不应该在欢乐时光之后上网! :P

标签: javascript scope closures


【解决方案1】:

inner()函数被调用时,首先发生的是var x

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

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

您的变量result 与您的inner() 函数无关,因为您有一个局部变量(因为那个var x)并且您忽略了返回的结果。

换句话说,你的代码就相当于这样:

var x = 10;

function outer () {
  x = 20;
}

outer();

var result = x;

【讨论】:

  • 非常感谢!这是一个很好的解释,它消除了我的任何困惑。你不仅理清了我对 result 值的认识,还让我看懂了内部函数中 x 的值!
  • 我的荣幸。此外,var 关键字可以出现在函数中的任何位置,并且在您输入函数时仍会考虑在内。我不确定它在 ES6+ 中是如何处理的。他们说它是作用域的,所以它应该只改变块作用域内的变量而不是整个函数。不过,我还没有测试过这个理论。
【解决方案2】:

因为您的内部函数定义了一个局部变量 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;

【讨论】:

    猜你喜欢
    • 2021-07-26
    • 2011-02-13
    • 2021-06-30
    • 2022-03-29
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多