【问题标题】:Declaring a variable using the var keyword inside a function. Why is it undefined, behind the scenes在函数中使用 var 关键字声明变量。为什么在幕后未定义
【发布时间】:2021-01-18 12:42:08
【问题描述】:

我是新手,我想确保我正确理解了 var 的提升。

var a = 2;
var x = function() {
   console.log(a);
   var a = 1;
};
x();

当调用“x”函数时,我得到的答案是“未定义”; 所以,引擎看到“x”的函数范围内有一个变量“a”,并将其赋值给“undefined”;

如果我们取出函数内部的变量“a”:

var a = 2;
var x = function() {
   console.log(a);
}
x();

然后我们得到答案“2”,因为引擎会在函数“x”中查找变量“a”,因为它在这里没有找到它,所以它会在外部/父/全局范围内查找为变量“a”,并找到它。

我做对了吗?

【问题讨论】:

  • 基本上没错。

标签: javascript var hoisting


【解决方案1】:

是的,你说得很对。当您说:

所以,引擎看到“x”的函数范围内有一个变量“a”,并将其赋值给“undefined”;

更像是:只提升声明,而不是初始化。声明但未初始化的变量默认为undefined。见https://www.w3schools.com/js/js_hoisting.asp#midcontentadcontainer

对于第二个函数,是的,这是正确的——首先它在函数的范围内查找,然后,由于找不到它,它在父范围内查找,然后是父级的父级,依此类推。

【讨论】:

    【解决方案2】:

    简而言之,当你这样做时:

    var a = 2;
    function() {
       console.log(a);
       var a = 1;
    }
    

    Javascript 在解释您的代码之前“提升”您的变量声明,基本上将您的代码转换为:

    var a = 2;
    function() {
       // there a now new "a" variable which is undefined
       var a; 
       console.log(a);
       a = 1;
    }
    

    当 JS 解析一个变量时,它会向上爬取函数作用域,直到找到一个与您想要的变量匹配的变量。当内部“a”变量被提升时,它实质上会覆盖您的外部“a”变量。在过去,将所有变量声明为“自上而下”以防止出现任何奇怪的意外问题是一种很好的做法。 constlet 不存在提升问题 - 这就是为什么今天大多数代码都是用它们而不是 var 编写的。

    【讨论】:

    • 感谢您的回复。第二段代码呢?它是先在函数内部查找,然后在函数外部查找吗?
    • OP 知道吊装,他甚至在他的问题中使用了这个词。
    • @weltschmerz 对不起我的无知什么是 OP?
    • 你是 OP——“原始海报”。我的评论是针对瑞恩的。
    • 我看到并删除了链接。尽管如此,我仍然会解释口译员实际发生的事情......即使在我原来的答案中也是如此。真的不值得 IMO 否决,但无论如何。
    猜你喜欢
    • 2012-05-31
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多