是否有提升变量的目的?

kev*_*vin 5 javascript hoisting

我最近一直在学习很多Javascript,而且我一直在努力理解提升变量的价值(如果有的话).

我理解(现在)JS是一个双程系统,它编译然后执行.另外,我理解var关键字'exists'在它声明的词法范围内,因此如果在引擎分配值之前调用它,那么为什么它是'undefined'.

问题是,为什么这甚至重要?有什么用途可以提升你不能不提升的变量?我觉得它只会创建不太可读的代码而没有收获......

是否存在提升变量有用的示例?

Ber*_*rgi 6

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

function even(n) { return n == 0 || !odd(n-1); }
function odd(n) { return !even(n-1); }
Run Code Online (Sandbox Code Playgroud)

没有"提升",该odd功能将不在该even功能的范围内.不支持它的语言需要前向声明,而不适合JavaScripts语言设计.

需要它们的情况可能会更频繁地出现在您认为:

const a = {
    start(button) {
        …
        button.onclick = e => {
            …
            b.start(button);
        };
    }
};
const b = {
    start(button) {
        …
        button.onclick = e => {
            …
            a.start(button);
        };
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 对于递归函数来说是有意义的,但这并不能解释为什么变量会被提升。它与循环变量引用有关(来自您的答案)吗?您也可以将其添加到答案中吗?我很好奇为什么 JS 会这样做,而为什么像 Java 这样的语言却不会,因为 java 也允许递归函数而无需前向声明。 (2认同)