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
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
你在声明变量之前不能使用它。
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。
因此,它不仅仅适用于您的代码,而是适用于将来将使用您的代码的人。你的代码中可能会留下一个潜在的重大失败。想象一下它在图书馆里。
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' 循环。
TA贡献1777条经验 获得超10个赞
的范围let仅限于该块。但如果不指定let关键字,它的作用域是全局环境(浏览器的全局作用域是 window 对象)
{
let a = 1;
b = 2;
}
console.log(a) //error
console.log(b) //2
添加回答
举报