亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用“let”和“var”之間有什么區別?

使用“let”和“var”之間有什么區別?

慕少森 2019-05-22 14:54:16
使用“let”和“var”之間有什么區別?ECMAScript 6介紹了該let聲明。我聽說它被描述為“本地”變量,但我仍然不太確定它與var關鍵字的行為有何不同。有什么區別?何時應該let使用var?
查看完整描述

4 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

let也可用于避免閉包問題。它綁定了新的價值而不是保留舊的參考,如下面的例子所示。

DEMO

for(var i = 1; i < 6; i++) {
  document.getElementById('my-element' + i)
    .addEventListener('click', function() { alert(i) })}

上面的代碼演示了一個典型的JavaScript閉包問題 對i變量的引用存儲在單擊處理程序閉包中,而不是實際值i

每個單擊處理程序都將引用同一個對象,因為只有一個計數器對象可以容納6,因此每次單擊時會得到6個。

一般的解決方法是將它包裝在匿名函數中并i作為參數傳遞。現在也可以通過使用let替代var方法來避免這些問題,如下面的代碼所示。

演示(在Chrome和Firefox 50中測試)

'use strict';for(let i = 1; i < 6; i++) {
  document.getElementById('my-element' + i)
    .addEventListener('click', function() { alert(i) })}


查看完整回答
反對 回復 2019-05-22
?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

let和之間有什么區別var?

  • 從函數的開頭,使用var語句定義的變量在其定義的函數中是已知的。(*)

  • 使用let語句定義的變量僅在其定義的塊中已知,從定義之后開始。(**)

要了解其中的差異,請考慮以下代碼:

// i IS NOT known here

// j IS NOT known here

// k IS known here, but undefined

// l IS NOT known here


function loop(arr) {

    // i IS known here, but undefined

    // j IS NOT known here

    // k IS known here, but has a value only the second time loop is called

    // l IS NOT known here


    for( var i = 0; i < arr.length; i++ ) {

        // i IS known here, and has a value

        // j IS NOT known here

        // k IS known here, but has a value only the second time loop is called

        // l IS NOT known here

    };


    // i IS known here, and has a value

    // j IS NOT known here

    // k IS known here, but has a value only the second time loop is called

    // l IS NOT known here


    for( let j = 0; j < arr.length; j++ ) {

        // i IS known here, and has a value

        // j IS known here, and has a value

        // k IS known here, but has a value only the second time loop is called

        // l IS NOT known here

    };


    // i IS known here, and has a value

    // j IS NOT known here

    // k IS known here, but has a value only the second time loop is called

    // l IS NOT known here

}


loop([1,2,3,4]);


for( var k = 0; k < arr.length; k++ ) {

    // i IS NOT known here

    // j IS NOT known here

    // k IS known here, and has a value

    // l IS NOT known here

};


for( let l = 0; l < arr.length; l++ ) {

    // i IS NOT known here

    // j IS NOT known here

    // k IS known here, and has a value

    // l IS known here, and has a value

};


loop([1,2,3,4]);


// i IS NOT known here

// j IS NOT known here

// k IS known here, and has a value

// l IS NOT known here

在這里,我們可以看到我們的變量j只在第一個for循環中被知道,而不是在之前和之后。然而,我們的變量i在整個函數中是已知的。


另外,請考慮塊范圍變量在聲明之前是未知的,因為它們不會被提升。您也不允許在同一塊中重新聲明相同的塊范圍變量。這使得塊范圍變量比全局或功能范圍變量更不容易出錯,這些變量被提升并且在多個聲明的情況下不會產生任何錯誤。

let今天使用安全嗎?

有些人會爭辯說,將來我們只會使用let語句,而var語句將會過時。JavaScript大師凱爾辛普森了一篇非常精細的文章,說明為什么他認為情況并非如此。

然而,今天絕對不是這樣。事實上,我們實際上需要問自己,使用該let陳述是否安全。這個問題的答案取決于您的環境:

  • 如果您正在編寫服務器端JavaScript代碼(Node.js),則可以安全地使用該let語句。

  • 如果您正在編寫客戶端JavaScript代碼并使用基于瀏覽器的轉換器(如Traceurbabel-standalone),則可以安全地使用該let語句,但是您的代碼在性能方面可能不是最優的。

  • 如果您正在編寫客戶端JavaScript代碼并使用基于節點的轉換器(如traceur shell腳本Babel),則可以安全地使用該let語句。而且因為您的瀏覽器只會知道轉換后的代碼,所以應該限制性能缺陷。

  • 如果您正在編寫客戶端JavaScript代碼而不使用轉換器,則需要考慮瀏覽器支持。

    仍然有一些瀏覽器根本不支持let

如何跟蹤瀏覽器支持

有關let在閱讀本答案時哪些瀏覽器支持該語句的最新概述,請參閱Can I Use頁面


(*)全局和功能范圍的變量可以在聲明之前初始化和使用,因為JavaScript變量是懸掛的這意味著聲明始終位于范圍的頂部。

(**)未提升塊范圍變量


查看完整回答
反對 回復 2019-05-22
  • 4 回答
  • 0 關注
  • 1551 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號