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)
}
}
這很酷?,F在您需要調用該函數 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
添加回答
舉報