【问题标题】:Need help understanding closures需要帮助了解闭包
【发布时间】:2018-07-09 07:52:14
【问题描述】:

我正在理解闭包并尝试做一些实验,就在那时我遇到了这个问题。

当我执行如下代码时:

    var hello;
    hello = 'abc';
    test();
    function test() {
       console.log(hello);
    }

输出: 'abc'

现在如果我在函数中添加另一个变量声明,那么输出就会不同

    var hello;
    hello = 'abc';
    test();
    function test() {
       console.log(hello);
       var hello = 'xyz';
    }

输出:未定义

我无法找出它为什么会这样。执行 test() 函数时,它会记录变量“hello”,直到现在 test() 函数中的变量声明未执行,所以它应该给我全局 hello 变量 val 但它返回未定义。

感谢您帮助我。

【问题讨论】:

  • 你应该看看Javascript hoisting做了什么。
  • 变量声明(var hello)部分被提升到函数的顶部,但 = 'xyz' 的定义只发生在它们被写入的地方。因此,您的函数将获得一个未定义但已声明的 hello 变量,直到您定义它以掩盖函数外部的变量。一开始有点奇怪。
  • 您可以将您的问题限制为两行代码:console.log(data); var data = "data";,然后您的问题将与许多其他问题重复
  • @Adelin 您享有将其作为重复投票的声誉。如果您知道有这么多重复,您应该考虑提供帮助并发布它。

标签: javascript closures frontend


【解决方案1】:

因为你的函数test里面的变量hello是hoisted,也就是说:

function test() {
   console.log(hello);
   var hello = 'xyz';
}

其实是一样的:

function test() {
   var hello;
   console.log(hello);
   hello = 'xyz';
}

【讨论】:

  • 在 ES6 中(用 let/const 适当声明的变量)编译器/解释器通知可能有问题,例如:ReferenceError: can't access lexical declaration 'hello' before initialization
猜你喜欢
  • 1970-01-01
  • 2017-06-19
  • 2016-05-03
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多