使用严格,不要在Javascript中按预期工作

时间:2015-06-29 11:19:11

标签: javascript ecmascript-6

当我使用“use strict”时,我在函数中声明了两次变量。我知道这个函数具有全局范围,它的变量也被视为具有窗口范围的全局变量,即window.car

但它不应该在带有let数据类型的if语句中重新声明速度和容量变量。 (“let”声明一个块作用域局部变量,可选择将其初始化为一个值。)

driver.manage().timeouts().setScriptTimeout(30,SECONDS);

请告诉我这里缺少的东西。

2 个答案:

答案 0 :(得分:3)

“let”声明块范围局部变量。但是仍然可以在局部范围内修改全局变量。

(function car() {
    "use strict";
    var speed = 100;
    const capacity = '1000CC';

    if(speed)  {
        let speed = 200;
        let capacity = '5000CC';
        console.log(speed,capacity);//inside local it is modified to 200

    }
    console.log(speed,capacity);//outside scope it pull from global scope to 100

})();

即使在严格模式下,您也可以重新声明/修改全局变量。

当您在同一范围内重新声明相同的变量时,您将只会收到错误。请看以下从MDN

中获取的示例
if (x) {
  let foo;
  let foo; // TypeError thrown.
}

但是,功能体没有这个限制! (但它在ES6中引发了一个错误,尽管如@Bergi评论,可能是MDN中的文档错误)

function do_something() {
  let foo;
  let foo; // This works fine.
}

答案 1 :(得分:0)

使用speed声明的变量var和使用speed声明的let两个不同的变量

if语句的主体内部,speed 的本地声明隐藏在外部块中声明的变量 - 它不会重新声明它。