这里变量的行为是啥,即闭包。输出未定义,我不明白
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;
如果你使用let
(var
现在真的只是let
和const
的遗产)你会得到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
请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。以上是关于这里变量的行为是啥,即闭包。输出未定义,我不明白的主要内容,如果未能解决你的问题,请参考以下文章