javascript - 在 Javascript 中使用 strict 和 let 不按预期工作

标签 javascript ecmascript-6

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

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

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

    if(speed)  {
        let speed = 200;
        let capacity = '5000CC';
        console.log(speed,capacity);

    }
    console.log(speed,capacity);

})();

请让我知道我在这里缺少什么。

最佳答案

“let”声明一个 block 作用域局部变量。但是仍然可以在局部范围内修改全局变量。

(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.
}

关于javascript - 在 Javascript 中使用 strict 和 let 不按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31114314/

相关文章:

javascript - jquery ajax POST 中的字符串参数

javascript - 删除对象数组内的对象键和值

Javascript - 我应该在需要特定接口(interface)的地方使用继承模型吗?

reactjs - 将 Material-ui 与 ecmascript6 结合使用

javascript - 检查并计算选中复选框的数量

javascript - 在 Node 4.x 中导出 ES6 类意外的保留字

javascript - Adobe DTM 广告拦截器标识符

javascript - 我需要向这个正则表达式添加数字

javascript - 实时什么时候我们会用到AOT和JIT

javascript - 何时使用基于 ES6 类的 React 组件与功能性 ES6 React 组件?