【问题标题】:What is the behavior of the variables here, i.e. closure. The output is undefined which I don't understand这里变量的行为是什么,即闭包。输出未定义,我不明白
【发布时间】:2021-11-04 22:14:05
【问题描述】:

这里的变量的行为是什么,即闭包。输出是“未定义”,我不明白。

var x = 21; 
var test = function () { 
    console.log(x); // output: undefined 
    var x = 20; 
}; 
test();

【问题讨论】:

  • 变量声明被提升到函数的顶部,但变量初始化没有被提升:developer.mozilla.org/en-US/docs/Glossary/Hoisting:“只有声明被提升 JavaScript 只提升声明,而不是初始化。如果一个变量是在代码中使用然后声明和初始化,使用时的值将是它的默认初始化(使用var声明的变量未定义,否则未初始化)。"
  • test 实际上看起来像这样:function() { var x; console.log(x); x = 20; }
  • 如果你使用letvar 现在真的只是letconst 的遗产)你会得到ReferenceError: can't access lexical declaration 'x' before initialization

标签: javascript node.js closures


【解决方案1】:

Javascript 最初会创建一个全局执行上下文,并且每次将函数压入调用堆栈时都会创建一个新的执行上下文。这发生在两个阶段:它首先创建一个变量环境,其中每个变量都存储在一个 key、value 对 variable_name: undefined 中(而函数与函数定义一起存储)。然后它开始逐行执行代码。

如果我要浏览这个示例: 全局执行上下文: 变量环境{ x:未定义, 测试:测试的函数定义 }

然后代码逐行执行,将x的值用21替换为undefined。现在调用了测试,因此创建了一个新的执行上下文

测试的执行上下文: { x:未定义 }

现在,当它开始执行代码时,它会在此执行上下文中查找 x 并看到该值未定义,并将其记录下来。 如果 x 在 test 中不存在,它会查看函数的父级执行上下文,这恰好是全局执行上下文,并且会记录 21。

阅读执行上下文:https://www.javascripttutorial.net/javascript-execution-context/ 然后阅读词法范围以了解此行为。

【讨论】:

    【解决方案2】:

    Javascript引擎会这样解释你的代码:

    var x = 21; 
    var test = function () {
        var x;
        console.log(x); // output: undefined 
        x = 20; 
    }; 
    test();
    

    【讨论】:

      【解决方案3】:

      你忘记在函数测试中输入参数 代码应该是这样的:-

      var x = 21; 
      var test = function (x) { //here u should put parameter "x"
          console.log(x); // The output from calling method
          var x = 20; //last "x"
          //if u want to get the value of last "x" should call 
          console.log(x); // the value of of last "x"
      }; 
      test(x); //here u should put parameter "x"
      

      在代码中我解释了每一件事?

      注意事项:- 用 let 定义的变量不能重新声明。 使用 let 定义的变量必须在使用前声明。 用 let 定义的变量具有块作用域。 允许在另一个块中使用 let 重新声明变量 但不允许使用 var

      【讨论】:

      • @jfriend00 你错了。函数体中的 var 声明不会掩盖参数。它实际上什么也没做:ideone.com/Ege7fu
      • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
      猜你喜欢
      • 2020-12-18
      • 2021-07-31
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      相关资源
      最近更新 更多