簡體   English   中英

JavaScript let 和 var 用法

[英]JavaScript let and var usage

不久前,我讀了一些關於在 JavaScript 中使用 let 和 var 的文章,他們說你使用“var”關鍵字(甚至在 for 循環中)聲明的變量只能在它的函數內工作,那么為什么可以創建多個for 循環在一個函數中,每個循環看起來像: for (var i = 0; i < array.length; i++); 並且 JavaScript 對“重新聲明” i 變量沒有問題? 謝謝 :)

JS 對var有一個特殊情況,因為它允許提升,這意味着允許對相同變量進行多次聲明,並且它們被移動到封閉的功能范圍內。 然而,它們仍然是相同的變量。 考慮以下代碼:

function foo(){
 for(var i=0; i<3; i++){
  console.log("x");
 }
 for(var i;i<6;i++){
  console.log("y");
 }
}

foo()

注意在第二個循環中沒有初始化 i ,但它會執行得很好並產生 3 x和 3 y 它曾經是舊瀏覽器的問題,但新瀏覽器只是允許它而不會給出錯誤。

看似小問題卻有復雜答案。 var是舊的方法聲明。 您可以根據需要在任何地方多次聲明它。 JavaScript 不會在意。 所有聲明的變量都可以立即使用,因為聲明會被移到函數代碼的最開頭。 這稱為提升。

let是聲明變量的新方法。 const存在,但我們現在對此不感興趣。 let是塊作用域。 let和 scoping 背后的規則可能會令人困惑,但學習/理解是有好處的。 它是 JavaScript 的未來。 我在我的博客文章中徹底討論了它, 這里

let 賦予您聲明限制在塊范圍內的變量的特權,與 var 不同的表達式語句。

var 是一個關鍵字,它定義全局變量,而不管塊的作用域如何。

ES6 引入了 'let' 關鍵字來解決這個問題。 它允許在函數內將變量綁定到其作用域,這樣您就無法在防止提升問題的情況下重新聲明它。 例子 -

for(var i=0; i<5; i++) {
    console.log(i);
}
console.log(i);

這里的輸出將是 - 0 1 2 3 4 5而不是 5 我們必須得到“未捕獲的引用錯誤”,因為變量 i 應該只能在函數內訪問。 由於 JavaScript 中的 Hoisting,所有變量和函數名稱在執行前都存儲在一處。 所以代碼實際上如下所示 -

var i;
for(i=0; i<5; i++) {
        console.log(i);
}
console.log(i);

如果您使用let關鍵字,則此問題已解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM