悬挂变量有目的吗?

时间:2018-10-18 17:08:50

标签: javascript hoisting

最近我已经学习了很多Javascript,并且一直试图了解提升变量的值(如果有)。

我了解(现在)JS是一个两遍系统,它会编译然后执行。另外,我知道var关键字在声明的词法范围内“存在”,因此,如果在引擎为它分配值之前调用它,为什么它是“未定义的”。

问题是,为什么那还要重要?提升没有提升就无法执行的变量有什么用?我觉得这只是创建了可读性差的代码而没有收获...

是否有一个示例,其中吊装变量有用吗?

3 个答案:

答案 0 :(得分:5)

“提升”对于相互递归的函数(以及其他所有以循环方式使用变量引用的函数)都是必需的:

function even(n) { return n == 0 || !odd(n-1); }
function odd(n) { return !even(n-1); }

如果没有“提升”,则odd函数将不在even函数的范围内。不支持它的语言则需要forward declarations,这不适合JavaScript语言设计。

需要它们的情况可能会以您认为的更多出现:

const a = {
    start(button) {
        …
        button.onclick = e => {
            …
            b.start(button);
        };
    }
};
const b = {
    start(button) {
        …
        button.onclick = e => {
            …
            a.start(button);
        };
    }
};

答案 1 :(得分:0)

不是。我唯一想到的是对您有帮助的地方,如果您急着编写代码,并且碰巧在以后声明它。因此,这并不重要,这是JS的一个怪异补充,很多人甚至都不知道,因为利用它感觉倒退且效率低下。

答案 2 :(得分:-1)

没有吊装之类的东西。吊起只是发生的编译阶段的副作用,并且Javascript在词法范围内。当编译器进入编译阶段时,它会在计算出程序中存在的词法作用域时将所有变量和函数声明放入内存中。但是没有hoisting函数,关键字或模块。实际上,在es2015版本之前,Ecmascript规范中甚至都没有引用它。

归根结底,提升是我们所有人都使用的百万美元词汇之一,通常是因为它比javascript经历的编译过程更易于使用,而不是解释和讨论。

我的建议是阅读Ecmascript规范,通过v8之类的javascript引擎工作,或者阅读Kyle Simpson的著作。他写了一个很棒的系列,叫做《你不懂JS》。

希望这会有所帮助!

起吊是您在ECMAScript®2015语言规范之前的任何规范性规范中都找不到的术语。起重被认为是思考执行上下文(特别是创建和执行阶段)如何在JavaScript中工作的一种通用方法。但是,这个概念起初可能有些混乱。 例如,从概念上讲,对提升的严格定义表明,变量和函数声明实际上已移到了代码的顶部,但这实际上不会发生。而是在编译阶段将变量和函数声明放入内存中,但仍保持在您在代码中键入它们的位置。 <-来自Mozilla文档

https://developer.mozilla.org/en-US/docs/Glossary/Hoisting