Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6:在“严格模式”下为循环内部分配多个let_Javascript_Ecmascript 6_Let - Fatal编程技术网

Javascript ES6:在“严格模式”下为循环内部分配多个let

Javascript ES6:在“严格模式”下为循环内部分配多个let,javascript,ecmascript-6,let,Javascript,Ecmascript 6,Let,我正在尝试“严格模式”,并在for循环中使用关键字let,如下所示: (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 reduc

我正在尝试“严格模式”,并在for循环中使用关键字let,如下所示:

  (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,但通过删除“use strict”,代码运行良好


代码是my

的一个子集。正如您所料,问题在于for循环中的initialiser语句:

let i = j = 0;
此声明与以下内容相同:

let i = (j=0);
这与:

j = 0; // would throw : Uncaught ReferenceError: j is not defined
let i = j;
如果要修复strict mode错误,则需要显式地将j声明为一个变量,并使用let j=0

由于提升,它在松散模式下工作,这将在全局范围内创建变量j


编辑:Bergi是对的,我混淆了概念,由于范围链而不是提升,它在全局范围内可用。如果某个变量在局部范围内未声明,它将查看该变量的外部词法范围。如果它仍然没有在那里定义,它将继续沿着作用域链向上移动,直到到达全局作用域。如果仍然没有在那里定义,那么它会自动在全局范围中定义,这就是您每次使用j时引用的变量。

问题正如您所预料的,for循环中的initialiser语句:

let i = j = 0;
此声明与以下内容相同:

let i = (j=0);
这与:

j = 0; // would throw : Uncaught ReferenceError: j is not defined
let i = j;
如果要修复strict mode错误,则需要显式地将j声明为一个变量,并使用let j=0

由于提升,它在松散模式下工作,这将在全局范围内创建变量j

编辑: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
建筑

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

试着这样做,你应该在使用之前分配j,对于让j,i=j=0;isum+next,0;执行与上述循环相同的操作。@Ryan.在没有严格模式的情况下安静地创建全局变量j,我现在就得到了它。尝试这种方式,在使用它之前,您应该分配j,对于let j,I=j=0;Isum+next,0;执行与上面循环相同的操作。@Ryan.在没有严格模式的情况下安静地创建一个全局变量j我现在明白了。您可能想补充一下它在草率模式下工作的原因:它只创建了一个全局变量j。这是几乎没有人想要的-所以每个人都使用严格模式。它的参考链接:不,这不是我想要的意思是。@Bergi您如何定义提升?@keithlee96提升指的是变量在其声明的整个范围内的可见性,而不仅仅是声明后的部分,以及进入所述范围时的初始化行为。但j=0甚至没有在任何地方声明,它只是一个赋值,因此提升一词不能应用一点也不奇怪。你可能想补充一下为什么它在草率模式下工作:它只是创建了一个全局j变量。这几乎没有人会想要-所以每个人都使用严格模式。它的参考链接:不,这不是提升的意思。@Bergi你如何定义提升?@keithlee96提升指的是变量在整个范围内的可见性在进入所述范围时,不只是声明和初始化行为后的部分。但j=0甚至没有在任何地方声明,它只是一个赋值,因此术语“提升”根本不适用。这是绝对正确的。接受的答案不是。这是绝对正确的。接受的答案不是。