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

Posted

技术标签:

【中文标题】这里变量的行为是啥,即闭包。输出未定义,我不明白【英文标题】: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 【参考方案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 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。

以上是关于这里变量的行为是啥,即闭包。输出未定义,我不明白的主要内容,如果未能解决你的问题,请参考以下文章

Lumen 5.3 未定义变量:闭包

多次调用打印函数后未定义的行为

在这个 C90 未定义的行为定义中,“有符号或无符号类型”是啥意思?

我收到“未定义的引用”错误,我不明白为啥(C++ OO)

闭包循环问题-for循环只显示最后一个i的值

未初始化的本地字符的行为?