为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森栏 2023-08-10 16:04:47
我正在学习 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(相互关注者);代码2for (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);
查看完整描述

5 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

如果不包含let关键字,则可以全局访问该变量


for (let i = 0; i < 3; i++) {

  console.log(i);

}


for (j = 0; j < 3; j++) {

  console.log(j);

}


console.log('j ', j); // accesible

console.log('i ', i); // inaccesible


查看完整回答
反对 回复 2023-08-10
?
烙印99

TA贡献1829条经验 获得超13个赞

是的,如果您没有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 scoped


console.log(let1); //9 - Block Scoped

console.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你在声明变量之前不能使用它。


查看完整回答
反对 回复 2023-08-10
?
喵喔喔

TA贡献1735条经验 获得超5个赞

是的,你必须。或者旧的var 正如其他回复提到的,您将在更广泛的范围内填充此变量。


想象一下这种情况,您需要创建一个打印前 10 个数字的函数:


function printNumbers(){

    for (i=0; i<10; i++) {

        console.log(i)

    }

}

这很酷。现在您需要调用该函数 12 次,很简单吧?


function printNumbers(){

    for (i=0; i<10; i++) {

        console.log(i)

    }

}


for (i=0; i<12; i++) {

   printNumbers()

}

好吧,如果您在 google chrome 控制台中执行此操作(不要)。你会烧坏你的浏览器的。因为i永远不会达到 12,你将陷入无限循环。12您可以通过更改来安全地测试这一点5,您将看到该函数仅运行1time 而不是5。


因此,它不仅仅适用于您的代码,而是适用于将来将使用您的代码的人。你的代码中可能会留下一个潜在的重大失败。想象一下它在图书馆里。


查看完整回答
反对 回复 2023-08-10
?
12345678_0001

TA贡献1802条经验 获得超5个赞

'let' 是关于词法作用域的,默认情况下 JavaScript 中的变量和对象具有全局作用域。正如其他人指出的那样,使用 var 将使变量的范围成为全局变量,因此任何东西都可以访问和修改它。


let 的另一个用例是在闭包中。这个例子来自 CS50 的 React Native 讲座 0 和 1。


这里 makeFunctionArray 返回一个打印 i 值的函数数组。


function makeFunctionArray() {

  const array = [];

  

  for(var i=0; i<5; i++) {

    array.push(function () { console.log(i) });

  }


  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' 循环。


查看完整回答
反对 回复 2023-08-10
?
不负相思意

TA贡献1777条经验 获得超10个赞

的范围let仅限于该块。但如果不指定let关键字,它的作用域是全局环境(浏览器的全局作用域是 window 对象)


{

   let a = 1;

   b = 2;

}


console.log(a) //error

console.log(b) //2


查看完整回答
反对 回复 2023-08-10
  • 5 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信