当我使用“use strict”时,我在函数中声明了两次变量。我知道这个函数具有全局范围,它的变量也被视为具有窗口范围的全局变量,即window.car
但它不应该在带有let数据类型的if语句中重新声明速度和容量变量。 (“let”声明一个块作用域局部变量,可选择将其初始化为一个值。)
driver.manage().timeouts().setScriptTimeout(30,SECONDS);
请告诉我这里缺少的东西。
答案 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
的本地声明隐藏在外部块中声明的变量 - 它不会重新声明它。