【问题标题】:'use strict' not stopping hoisting in function scope'use strict' 不停止函数范围内的提升
【发布时间】:2015-08-14 01:56:44
【问题描述】:

我的问题在于我正在学习 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;
               }
}

【问题讨论】:

  • 我不认为严格模​​式打算移除提升
  • 我读到它确实如此,这就是为什么它产生了我的问题......我从各个网站上读到了

标签: javascript using strict hoisting


【解决方案1】:

变量声明(即var x;)在它们写入的整个范围内都有效,即使您在分配后声明也是如此。这就是 "hoisting" 的含义:var x; 被提升到作用域的开头,而赋值 x = 6; 很好,因为 x 已在该作用域的某处声明。

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

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

【讨论】:

  • 关于隐式全局作用域的好注释,传统上,在函数作用域中声明的任何东西都只在函数本身的持续时间内可用并且“有效”。您是说严格模式是使作用域回归到上述传统方式的唯一方法吗?
  • 只要您认真编写var 声明,严格模式没有任何区别。即使没有严格模式,变量仍然限定在它们声明的块中。只有当您忘记声明变量时,严格模式才会抓住您。
  • 另请注意,“生活”与“在范围内”是完全不同的概念。例如,如果我写function foo() { var x = {}; return x; },那么x 将只在foo 的范围内,但它的值可能会“存活”更长的时间,具体取决于调用者对它的处理。
【解决方案2】:

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

【讨论】:

  • 谢谢,我真的更像是一个正式的程序员,更喜欢旧方法。我读到严格会关闭提升,因此我的测试.. 提升并没有像其他人所说的那样关闭,这让我很困扰。
  • 我认为混淆可能来自这样一个事实,正如@Thomas 指出的那样,严格模式确实需要您声明变量
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    相关资源
    最近更新 更多