5 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果不包含let關(guān)鍵字,則可以全局訪問(wèn)該變量
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貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊
是的,如果您沒(méi)有l(wèi)et在for,for...of或for...in循環(huán)等中專門使用關(guān)鍵字,它們的工作方式將與您使用關(guān)鍵字時(shí)相同let。
但是,當(dāng)您沒(méi)有顯式聲明 usinglet關(guān)鍵字時(shí),該變量將被聲明為var. let和const是塊級(jí)變量,但您還需要了解“函數(shù)不是唯一的塊,any{ }基本上是一個(gè)塊”。即一旦聲明“var”將成為函數(shù)作用域變量,如果它不在函數(shù)內(nèi)部并在外部聲明,那么它就變得全局可用,考慮到您可能有多個(gè)使用變量的 for 循環(huán),這不是一件好事名為“i”,如果您不使用 let,它只會(huì)不斷增加舊的'i'. 請(qǐng)看下面兩個(gè)例子來(lá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();
我所說(shuō)的全球增值的意思是'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 中,引入了嚴(yán)格模式,這基本上是一種可以選擇不編寫“草率模式”JS 代碼的方式,并且可以通過(guò)'use strict';
全局或函數(shù)級(jí)別指定來(lái)使用它。大多數(shù)公司和開(kāi)發(fā)人員在其專業(yè)代碼庫(kù)中都使用嚴(yán)格模式。
我想傳達(dá)的一點(diǎn)是,“嚴(yán)格模式”不允許您在不聲明變量的情況下使用 for 循環(huán),您必須明確指定“var”或“l(fā)et”關(guān)鍵字。因此,聲明變量始終是一個(gè)好習(xí)慣。
最后,在當(dāng)前的 ES6 時(shí)代,使用var
關(guān)鍵字聲明變量并不被認(rèn)為是一個(gè)好的做法,因?yàn)榉Q為“提升”,這基本上意味著在聲明 a 之前var x;
,如果你嘗試使用它,你仍然可以,但是它的值將是“未定義”。但如果let
你在聲明變量之前不能使用它。

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊
是的,你必須?;蛘吲f的var 正如其他回復(fù)提到的,您將在更廣泛的范圍內(nèi)填充此變量。
想象一下這種情況,您需要?jiǎng)?chuàng)建一個(gè)打印前 10 個(gè)數(shù)字的函數(shù):
function printNumbers(){
for (i=0; i<10; i++) {
console.log(i)
}
}
這很酷?,F(xiàn)在您需要調(diào)用該函數(shù) 12 次,很簡(jiǎn)單吧?
function printNumbers(){
for (i=0; i<10; i++) {
console.log(i)
}
}
for (i=0; i<12; i++) {
printNumbers()
}
好吧,如果您在 google chrome 控制臺(tái)中執(zhí)行此操作(不要)。你會(huì)燒壞你的瀏覽器的。因?yàn)閕永遠(yuǎn)不會(huì)達(dá)到 12,你將陷入無(wú)限循環(huán)。12您可以通過(guò)更改來(lái)安全地測(cè)試這一點(diǎn)5,您將看到該函數(shù)僅運(yùn)行1time 而不是5。
因此,它不僅僅適用于您的代碼,而是適用于將來(lái)將使用您的代碼的人。你的代碼中可能會(huì)留下一個(gè)潛在的重大失敗。想象一下它在圖書館里。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
'let' 是關(guān)于詞法作用域的,默認(rèn)情況下 JavaScript 中的變量和對(duì)象具有全局作用域。正如其他人指出的那樣,使用 var 將使變量的范圍成為全局變量,因此任何東西都可以訪問(wèn)和修改它。
let 的另一個(gè)用例是在閉包中。這個(gè)例子來(lái)自 CS50 的 React Native 講座 0 和 1。
這里 makeFunctionArray 返回一個(gè)打印 i 值的函數(shù)數(shù)組。
function makeFunctionArray() {
const array = [];
for(var i=0; i<5; i++) {
array.push(function () { console.log(i) });
}
return array;
}
const functionArray = makeFunctionArray();
functionArray[0]();
現(xiàn)在,您期望 functionArray[0]() 打印什么?0,對(duì)嗎?因?yàn)槲覀冋谡{(diào)用索引為零處的函數(shù),它應(yīng)該控制臺(tái)日志 0。但它不會(huì)打印 0,而是打印 5。
這是因?yàn)椤癷”具有全局作用域,并且當(dāng)循環(huán)終止時(shí)其值為 5。我們從 makeArray 函數(shù)返回的函數(shù)(閉包)仍然可以訪問(wèn)“i”,并且返回時(shí)值 5 會(huì)被包含在其中。所以每個(gè) functionArray[index]() 都會(huì)打印 5。
如果 'i' 是一個(gè) let,則可以使用 'let' 來(lái)避免這種情況,它的作用域?qū)H為 'for' 循環(huán)。

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊
的范圍let僅限于該塊。但如果不指定let關(guān)鍵字,它的作用域是全局環(huán)境(瀏覽器的全局作用域是 window 對(duì)象)
{
let a = 1;
b = 2;
}
console.log(a) //error
console.log(b) //2
添加回答
舉報(bào)