JavaScript小知識:for 循環中的 let 聲明

2020-12-11 JSindexhtml

在let出現之前,我們在for循環中是用var定義的迭代器變量會溢出循環體:

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

//循環內容

}

console.log(i);//5

當使用let聲明時,這個問題就不存在了,因為let聲明的迭代器變量作用域僅限於for循環體。

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

//循環內容

}

console.log(i)// ReferenceError: i is not defined

使用var聲明時,經常遇到的問題就是迭代器變量的奇怪聲明和修改。

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

setTimeout(()=>console.log(i),0)

}

這個循環你想要的列印結果是0、1、2、3、4,但是實際結果是5、5、5、5。

這個函數可以使用箭頭函數:

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

setTimeout(function(){console.log(i);},0)

}。

上面的列印結果之所以是5、5、5、5,是因為在迭循環退出時,迭代器變量仍然被設置為使循環結束退出的值5。所以導致後面的setTimeout運行的時候引用的是同一個變量i=5,因此console.log(i)最終的值是5。

如果我們使用let聲明for循環的迭代器變量:

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

setTimeout(()=>console.log(i);0);

}

列印輸出的結果:0、1、2、3、4

當我們使用let聲明for循環的迭代器變量時,js引擎會每循環一次就聲明一個新的迭代器變量,直到聲明的變量小於5時循環結束退出。所以每次setTimeout引用的都是獨立的迭代器變量實體,因此console.log()輸出的值技術執行循環迭代器時的迭代器變量值。

相關焦點

  • JavaScript中var、let和const的使用
    我們學習前端的程式設計師就會發現,在JavaScript中,我們經常會使用var、let和const來聲明變量。
  • var和let聲明變量時的一些區別
    var和let聲明變量時的一些區別1.如果在全局作用域中用var聲明變量,此變量會默認成為window的一個屬性,let聲明的變量則不會添加到window對象中。但是在塊級作用域中用let聲明變量,那麼此變量就有了塊級作用域,就必須只有在此塊級作用域才能訪問此變量。3.var聲明的變量有變量提升特性,let聲明則沒有這個特性。變量提升:請點擊:javascript中的變量提升的簡單說明。4.var可以允許重複聲明相同的變量,後者會覆蓋前者,let則不能重複聲明相同的變量。
  • 從 JavaScript 到 TypeScript - 聲明類型
    聲明類型聲明類型,主要是指聲明變量/常量,函數/方法和類成員的類型。JS 中使用 var 聲明一個變量,ES6 擴展了 let 和 const。這幾種聲明 TypeScript 都支持。n * n;}// 聲明 test 是無返回值的function test(): void {    for (let i: number = 0; i < 10; i++) {  // 聲明 i 是 number        console.log(pow(i));    }}
  • JavaScript小知識:let和var的作用域
    在ECMAScript6中又新增了兩個變量聲明關鍵字:let和const。那麼這個有什麼不同?var只有全局作用域和函數作用域,所謂全局作用域就是在代碼的任何位置都能訪問var聲明的變量,而函數作用域在變量聲明的當前函數內部訪問變量。
  • JavaScript let 和 const 關鍵字介紹 | JavaScript 教程
    在塊中重新聲明變量也會重新聲明塊外的變量:var x = 10;// 這裡輸出 x 為 10{ var x = 2; // 這裡輸出 x 為 2}// 這裡輸出 x 為 2點擊下方「閱讀原文」可親試效果let 關鍵字就可以解決這個問題,因為它只在 let 命令所在的代碼塊 {
  • JavaScript
    2.1997 年,ECMA (歐洲計算機製造商協會),制定出客戶端腳本語言的標準:ECMAScript,統一了所有客戶端腳本語言的編碼方式 javascript組成: 1、ECMAscript javascript的語法(變量、函數、循環語句等語法) 2、DOM 文檔對象模型 操作html和css的方法 3、BOM 瀏覽器對象模型 操作瀏覽器的一些方法
  • 3.2.3 JavaScript中for循環語句的使用
    JavaScript中的for循環語句也稱為計次循環語句,一般用於循環次數已知的情況。2)條件表達式:作為循環條件,一個包含比較運算符的表達式,用來限定循環變量的邊限。如果循環變量的值超出了該邊限,則停止該循環語句的執行。3)迭代語句:用來改變循環變量的值,從而控制循環的次數,通常是對循環變量的值進行變大或變小的操作。
  • JavaScript 中 Eval 函數的前世今生,執行代碼字符串
    // Hello代碼字符串可能會比較長,包含換行符、函數聲明和變量等。因此我們不能從外部訪問在 eval 中聲明的函數和變量:// 提示:本教程所有可運行的示例都默認啟用了嚴格模式 'use strict'eval("let x = 5; function f() {}");alert(typeof x); // undefined(沒有這個變量)// 函數 f 也不可從外部進行訪問
  • JavaScript中的簡單排序算法
    英文 | https://medium.com/javascript-in-plain-english/simple-sorting-algorithms-in-javascript
  • JavaScript 執行機制
    1.關於javascriptjavascript是一門單線程語言,在最新的HTML5中提出了Web-Worker,但javascript是單線程這一核心仍未改變。所以一切javascript版的"多線程"都是用單線程模擬出來的,一切javascript多線程都是紙老虎!
  • 走近 (javascript, 函數式)
    在函數式編程裡,把要處理的數據看做一個在許多函數中流動的數據流。再將聲明的函數模塊組合出正確的函數組合,讓數據「流」過一串函數後達到想要的目的。javascript 對函數式編程的支持在 javascript 中,函數是一等的,也就是說,在 javascript 中,函數本身也是一個值。
  • Javascript 性能測試 [每日前端夜話0xB1]
    正文共:916 字預計閱讀時間:7 分鐘作者:Deepak Gupta翻譯:瘋狂的技術宅來源:codeburst我們都知道 for 循環比 each 或 javascript 函數更快,因為在javascript函數的引擎下可能會使用for循環或其他我不確定的東西。
  • 3.2.1 JavaScript中while循環語句的使用
    JavaScript中的while循環語句也稱為前測試循環語句,它先測試循環條件是否成立,如果成立則循環,如果不成立則不循環。運作說明:首先判斷表達式的值是否為true,即判斷循環條件是否成立。如果值為true,則執行語句組,執行完畢後,返回來再判斷表達式的值是否為true;如果值為false,則不循環,即執行while循環語句後面的語句。
  • JavaScript小知識:Boolean數據類型與Number中的浮點數
    let ble=true;let abe=false;true和false區分大小寫,所以True和False是有效的標識符,不是布爾值。let message="hello word!"浮點數也可以使用科學計數法表示,至於什麼是科學計數法,這屬於初中的代數知識,這裡不做討論。這裡我們用e代替10,例如0.1表示為1e-1,用科學計數法表示為1*10^-1,也就就是1乘以10的負一次方。
  • JavaScript 實現 JSON 解析器
    Hau譯者:龔亮聲明:本翻譯僅做學習交流使用,轉載請註明來源。這是因為在一篇文章中實現JavaScript編譯器對我來說是一項艱巨的任務。好吧,不用擔心。JSON 也是一種語言。它具有自己的語法,您可以從規範[5]中參考。編寫 JSON 解析器所需的知識和技術可以轉移到編寫 JS 解析器中。因此,讓我們開始編寫 JSON 解析器!理解語法如果您查看了規範頁面,會發現有2個圖。
  • JavaScript6 新語法 let 有什麼優勢?
    語法>>for(var i=0; i<2; i++){console.log('outer i: ' + i);for(var i=0; i<2; i++){console.log('inner i: '+i);}}這是一個常見的嵌套循環,都定義了變量 i 來計數,執行結果如下:outer i: 0inner
  • 這一次,徹底弄懂 JavaScript 執行機制
    稍安勿躁,正因為js是一行一行執行的,所以我們以為js都是這樣的:let a = '1';console.log(a);let b = '2';console.log(b);然而實際上js是這樣的:我們真的要徹底弄明白javascript的執行機制了。1.關於javascriptjavascript是一門單線程語言,在最新的HTML5中提出了Web-Worker,但javascript是單線程這一核心仍未改變。
  • 不要再在JavaScript中用『var』聲明變量了
    現在我用關鍵詞const和let在JavaScript中聲明所有變量,你也應該這麼做。讓我們一起學習如何且為什麼要這麼做。聲明真正的常量變量,顧名思義即變化的值。以下是JavaScript範圍異常的摘要:· 一個變量可以使用兩次var(重聲明)· 默認情況下,頂級變量是全局變量(全局對象)· 可以在聲明前使用變量(提升)· 循環中的變量重複使用同樣的引用(閉包)
  • 從JavaScript的事件循環到Promise
    這種情況下,參與異步過程的其實有2個線程主體,一個是javascript的主線程,另一個是瀏覽器線程。熟悉Javascript的人都知道,Javascript內部有一個事件隊列,所有的處理方法都在這個隊列中,Javascript主線程就是輪詢這個隊列處理,這個好處是使得CPU永遠是忙碌狀態。
  • 3.2.2 JavaScript中do-while循環語句的使用
    JavaScript中的do-while循環語句也稱為後測試循環語句,它先執行一次,然後再測試循環條件是否成立,如果成立則循環,如果不成立則結束循環。2)表達式:一個包含比較運算符的條件表達式,用來指定循環條件。運作說明:先執行一次循環體的語句組,然後再判斷表達式的值是否為true,即判斷循環條件是否成立。如果值為true,則繼續執行循環體的語句組,執行完畢後,再判斷表達式的值是否為true;如果值為false,則循環結束。