'use strict' 在函数范围内不停止提升

'use strict' not stopping hoisting in function scope

我的问题就在这里我正在学习JavaScript但对编程来说并不陌生。 我了解提升,但是在严格模式下,这不应该产生错误,并且在将 6 分配给未声明的变量或 document.getElement... 分配给 x 时被捕获,这不会产生错误,所以我的诊断是吊装仍在继续......我不喜欢并希望通过使用严格来摆脱它。使用 Chrome 版本 42.0.2311.152 m 作为我的浏览器

function strictMode(){
    'use strict';
    try {
        x = 6;
        document.getElementById('hoisting').innerHTML = x;
        var x;
     }
     catch(err) {
                    document.getElementById('error_report').innerHTML = 
                        "There was an error that occured (Were in Strict Mode)" +
                            " " + err.message;
               }
}

变量声明(即 var x;)在它们写入的整个范围内有效,即使您在赋值后声明也是如此。这就是 "hoisting" 的意思:var x; 被提升到范围的开头,赋值 x = 6; 没问题,因为 x 已在该范围内的某处声明.

Strict mode 不会改变这一切。如果您完全省略 var x; 声明,它 抛出错误;如果没有严格模式,变量的作用域将隐含为全局作用域。

在 ES2015 (a.k.a.ES6) 中,通过使用 let 关键字而不是 var 来避免提升。 (另一个区别是用 let 声明的变量是周围块的局部变量,而不是整个函数。)

有一些奇怪的事情 javascript 允许,作为学习语言的人,您必须学会与良好的编码实践作斗争(simicolons 是另一个很好的例子)。在提升的情况下,通常好的做法是在范围的顶部声明您的变量,无论如何它们都会被提升到那里。如前所述,严格模式不是灵丹妙药,不会为您强制执行。

简而言之,JavaScript在严格模式下不允许使用未声明的变量。这里没有任何内容与它禁用提升有关。如果未声明正在初始化的变量,它只会抛出错误。