在Javascript中使用strict和let不能按预期工作
在使用“use strict”时,我在函数中声明了两次变量。我知道这个函数有全局作用域,它的变量也被视为全局的,比如window.car 但它不应该在带有let数据类型的if语句中重新声明速度和容量变量。(“let”声明块作用域局部变量,可以选择将其初始化为值。) 请告诉我这里缺少什么。“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
(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.
}