我们必须在 JavaScript For 循环中包含 Let 关键字吗?

我正在学习 For Loops,我发现以下两段代码的工作原理是一样的。代码1:


for (let i=0 ; i<bobsFollowers.length; i++){

  for ( let j=0; j<tinasFollowers.length; j++){

    if (bobsFollowers[i] === tinasFollowers[j]){

      mutualFollowers.push(tinasFollowers[i]);

    }

  }

}

console.log(相互关注者);


代码2


for (i=0 ; i<bobsFollowers.length; i++){

  for ( j=0; j<tinasFollowers.length; j++){

    if (bobsFollowers[i] === tinasFollowers[j]){

      mutualFollowers.push(tinasFollowers[i]);

    }

  }

}


console.log(mutualFollowers);


森栏
浏览 104回答 5
5回答

子衿沉夜

如果不包含let关键字,则可以全局访问该变量for (let i = 0; i < 3; i++) {&nbsp; console.log(i);}for (j = 0; j < 3; j++) {&nbsp; console.log(j);}console.log('j ', j); // accesibleconsole.log('i ', i); // inaccesible

烙印99

是的,如果您没有let在for,for...of或for...in循环等中专门使用关键字,它们的工作方式将与您使用关键字时相同let。但是,当您没有显式声明 usinglet关键字时,该变量将被声明为var. let和const是块级变量,但您还需要了解“函数不是唯一的块,any{ }基本上是一个块”。即一旦声明“var”将成为函数作用域变量,如果它不在函数内部并在外部声明,那么它就变得全局可用,考虑到您可能有多个使用变量的 for 循环,这不是一件好事名为“i”,如果您不使用 let,它只会不断增加旧的'i'. 请看下面两个例子来理解我上面这句话的意思:const test = function(){let let1 = 1;var var1 = 2;{let let1 = 9; //This is a block scoped variable limited to this { } block var var1 = 3; //re-initialization still overrides the original var 1 variable's value because once declared, the var variable is function scopedconsole.log(let1); //9 - Block Scopedconsole.log(var1); //3 - Function Scoped}console.log(let1); //1 - Function Scoped console.log(var1); //3 - Still Function Scoped, always function scoped}test();我所说的全球增值的意思是'i':for(i=0; i< 2; i++){console.log('first loop', i)}for(i;i< 5; i++){//I am not initializing i to 0, but I'm just trying to show that it is a global variable now.console.log('second loop', i)}for(i; i< 7; i++){ //I am not initializing i to 0, but I'm just trying to show that it is a global variable now.console.log('third loop', i)}其次,在 ES5 中,引入了严格模式,这基本上是一种可以选择不编写“草率模式”JS 代码的方式,并且可以通过'use strict';全局或函数级别指定来使用它。大多数公司和开发人员在其专业代码库中都使用严格模式。我想传达的一点是,“严格模式”不允许您在不声明变量的情况下使用 for 循环,您必须明确指定“var”或“let”关键字。因此,声明变量始终是一个好习惯。最后,在当前的 ES6 时代,使用var关键字声明变量并不被认为是一个好的做法,因为称为“提升”,这基本上意味着在声明 a 之前var x;,如果你尝试使用它,你仍然可以,但是它的值将是“未定义”。但如果let你在声明变量之前不能使用它。

喵喔喔

是的,你必须。或者旧的var 正如其他回复提到的,您将在更广泛的范围内填充此变量。想象一下这种情况,您需要创建一个打印前 10 个数字的函数:function printNumbers(){&nbsp; &nbsp; for (i=0; i<10; i++) {&nbsp; &nbsp; &nbsp; &nbsp; console.log(i)&nbsp; &nbsp; }}这很酷。现在您需要调用该函数 12 次,很简单吧?function printNumbers(){&nbsp; &nbsp; for (i=0; i<10; i++) {&nbsp; &nbsp; &nbsp; &nbsp; console.log(i)&nbsp; &nbsp; }}for (i=0; i<12; i++) {&nbsp; &nbsp;printNumbers()}好吧,如果您在 google chrome 控制台中执行此操作(不要)。你会烧坏你的浏览器的。因为i永远不会达到 12,你将陷入无限循环。12您可以通过更改来安全地测试这一点5,您将看到该函数仅运行1time 而不是5。因此,它不仅仅适用于您的代码,而是适用于将来将使用您的代码的人。你的代码中可能会留下一个潜在的重大失败。想象一下它在图书馆里。

12345678_0001

'let' 是关于词法作用域的,默认情况下 JavaScript 中的变量和对象具有全局作用域。正如其他人指出的那样,使用 var 将使变量的范围成为全局变量,因此任何东西都可以访问和修改它。let 的另一个用例是在闭包中。这个例子来自 CS50 的 React Native 讲座 0 和 1。这里 makeFunctionArray 返回一个打印 i 值的函数数组。function makeFunctionArray() {&nbsp; const array = [];&nbsp;&nbsp;&nbsp; for(var i=0; i<5; i++) {&nbsp; &nbsp; array.push(function () { console.log(i) });&nbsp; }&nbsp; return array;}const functionArray = makeFunctionArray();functionArray[0]();现在,您期望 functionArray[0]() 打印什么?0,对吗?因为我们正在调用索引为零处的函数,它应该控制台日志 0。但它不会打印 0,而是打印 5。这是因为“i”具有全局作用域,并且当循环终止时其值为 5。我们从 makeArray 函数返回的函数(闭包)仍然可以访问“i”,并且返回时值 5 会被包含在其中。所以每个 functionArray[index]() 都会打印 5。如果 'i' 是一个 let,则可以使用 'let' 来避免这种情况,它的作用域将仅为 'for' 循环。

不负相思意

的范围let仅限于该块。但如果不指定let关键字,它的作用域是全局环境(浏览器的全局作用域是 window 对象){&nbsp; &nbsp;let a = 1;&nbsp; &nbsp;b = 2;}console.log(a) //errorconsole.log(b) //2
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript