我正在尝试'严格模式',并使用关键字让像这样的前面的内部:
(function() {
"use strict";
var numbers = [1,2,3,4,5];
var value;
for (let i = j = 0; i < numbers.length; i++) {
j += numbers[i];
value = j;
}
console.log ("tThe reduced value is: ", value);
})();
这会产生一个未定义的参考文献:J不是定义的,而是通过删除"严格"代码运行良好。
我的jsfiddle
问题是您所期望的,for for for循环中的初始评估语句:
let i = j = 0;
此语句与:
相同let i = (j=0);
与:
相同j = 0; // would throw : Uncaught ReferenceError: j is not defined
let i = j;
如果要修复严格模式错误,则需要明确将J声明为变量,让J = 0;
它由于提升而在草率模式下起作用,这将在全局范围中创建变量J。(https://www.w3schools.com/js/js_hoisting.asp(
编辑:Bergi是对的,我混合了这些概念,由于范围链而不是吊装,它在全球范围内可用。如果变量在本地范围内未申请,则它查看该变量的外词法范围。如果在那里仍未定义,它将不断上升范围链,直到达到全球范围为止。如果仍未在此处定义,则它会自动在全局范围中定义,这是您每次使用j。
构造
let i = j = 0
实际上与关键字let
无关。
让我们看看它在引擎盖下的作用:
let i // declares i
j = 0 // assigns a variable j to 0 that is not declared
// If it does not exist it creates the variable on the `window` object.
i = j // in fact i = window.j
正确使用
let i = 0, j = 0