【问题标题】:Use strict and let not working as expected in Javascript在 Javascript 中使用严格并让其无法按预期工作
【发布时间】:2015-09-15 20:03:29
【问题描述】:

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

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

(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);

})();

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

【问题讨论】:

  • 那么问题是什么,我从日志中得到了200 "5000CC",正如预期的那样?
  • 我认为应该有错误。 “你不能在 if 语句中重新声明速度和容量”,因为我使用的是“使用严格”
  • @JahanzaibAslam 不跨越不同的范围,因为 letconst 都是块范围
  • 您不是在重新声明变量,而是在 ìf` 语句的块范围内初始化一个新变量 speedcapacity
  • 。请阅读:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。只有在同一块范围内重新声明同一变量会引发 TypeError。

标签: javascript ecmascript-6


【解决方案1】:

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

但是,函数体没有这个限制! (但正如@Bergi 所评论的那样,它会在 ES6 中引发错误,可能是 MDN 中的文档有误)

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

【讨论】:

  • 但是我可以在使用“use strict”时在块语句中重新声明具有let数据类型的相同全局变量吗?
  • 可以,可以重新申报。
  • 我认为应该有错误。 “您不能在 if 语句中重新声明速度和容量变量”,因为我使用的是“使用严格”模式。你怎么看?
  • 函数体没有这个限制”是垃圾,它在 ES6 中也会抛出错误。你从哪里得到的?
  • @Bergi,希望你修改 mdn 文档?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-09-14
    • 2014-09-10
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2017-03-25
    相关资源
    最近更新 更多