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

在Javascript中使用strict和let不能按预期工作,javascript,ecmascript-6,Javascript,Ecmascript 6,在使用“use strict”时,我在函数中声明了两次变量。我知道这个函数有全局作用域,它的变量也被视为全局的,比如window.car 但它不应该在带有let数据类型的if语句中重新声明速度和容量变量。(“let”声明块作用域局部变量,可以选择将其初始化为值。) 请告诉我这里缺少什么。“let”声明一个块作用域局部变量。但仍然可以在局部范围内修改全局变量 (function car() { "use strict"; var speed = 100; const cap

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

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

请告诉我这里缺少什么。

“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

})();
即使在严格模式下,也可以重新声明/修改全局变量


只有在同一范围内重新声明同一变量时,才会出现错误。请看下面的例子

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


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


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

但是我可以在使用“use strict”时在块语句中使用let data type重新声明相同的全局变量吗?是的,您可以重新声明。我认为应该有错误。“不能在if语句中重新声明速度和容量变量”,因为我使用的是“使用严格”模式。你认为“函数体没有这个限制”是垃圾,它在ES6中也会抛出一个错误。你从哪里得到的?@Bergi,我希望你能修改mdn文档?那么问题是什么,我从日志中得到了
200“5000CC”
,正如预期的那样?我想应该有错误。“您不能在if语句中重新声明速度和容量”,因为我使用的是“use strict”@JahanzaibAslam不跨不同的作用域,因为
let
const
都是块作用域。您没有重新声明变量,您正在初始化ìf`语句块范围内的新变量
速度
容量
)。否。请阅读:。只有在同一块范围内重新声明同一变量才会引发TypeError。
(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

})();
if (x) {
  let foo;
  let foo; // TypeError thrown.
}
function do_something() {
  let foo;
  let foo; // This works fine.
}