成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ES6之"let"能替代"var"嗎?

lewinlee / 866人閱讀

摘要:我們將循環(huán)執(zhí)行五次,每次將一個函數(shù)到數(shù)組中。只有當(dāng)你理解了,才能給出正確的答案。讀者提到的兩個問題聲明的變量不是完全不可更改。不僅如此,而且有些最新的瀏覽器也還沒有支持。

譯者按: 使用let的確會比var安全很多。

原文: Why You Shouldn’t Use ‘var’ Anymore

譯者: Fundebug

為了保證可讀性,本文采用意譯而非直譯。

我已經(jīng)使用ES2015(ES6)的語法編寫JavaScript程序很久了,并且喜歡上它提供的新特性帶來的優(yōu)雅和簡潔。我最習(xí)慣的就是不再使用var,而是let/const。我想當(dāng)然的以為let僅僅是var的替代者,而事實上let還為我們提供了更加精細(xì)的作用域。

我大多數(shù)時候使用的變量都是用const來聲明,因為如果嘗試對使用const聲明的變量進行修改,將會報錯。這可以避免不小心將一個不該修改的常量值修改。但是,我們還是需要可以聲明可以被修改的變量,比如在循環(huán)里面的計數(shù)器,我們需要不斷地對改變了加1??墒菫槭裁次覀兪褂?b>let而不是var呢?

最簡單的答案就是let提供塊作用域(block-scoping),這會比var提供的以函數(shù)為作用域有更加精細(xì)化的控制。為了便于理解,我來用一個經(jīng)典的前端工程師面試的問題來描述兩者的區(qū)別。

問題: 在下面的例子中,請說出控制臺的打印結(jié)果。

var callbacks = [];
(function() {
  for (var i = 0; i < 5; i++) {
    callbacks.push( function() { return i; } );
  }
})();
console.log(callbacks.map( function(cb) { return cb(); } ));

我們將for循環(huán)執(zhí)行五次,每次將一個函數(shù)push到callbacks數(shù)組中。最后callbacks數(shù)組里面的每一個函數(shù)的執(zhí)行結(jié)果打印出來。
一個新手工程師經(jīng)過深思熟慮可能會回答[0, 1 , 2, 3, 4], 然而卻掉入了JavaScript的"hoisting陷阱"。

只有當(dāng)你理解了hoisting, 才能給出正確的答案[5, 5, 5, 5, 5]

var callbacks = [];
(function() {
  var i;
  for (i = 0; i < 5; i++) {
    callbacks.push( function() { return i; } );
  }
})();
console.log(callbacks.map( function(cb) { return cb(); } ));

注意上面的代碼,JavaScript將變量提升到函數(shù)定義的頂部,經(jīng)過整個for循環(huán),callbacks里面存儲的5個函數(shù)指向的同一個變量i的值已經(jīng)是5。所以最終打印出來的值都為5。

在以前要通過各種奇淫技巧來解決這個問題,并成功返回[0, 1, 2, 3, 4], 現(xiàn)在我們有了let,就可以很簡單解決問題:

var callbacks = [];
(function() {
  for (let i = 0; i < 5; i++) {
    callbacks.push( function() { return i; } );
  }
})();
console.log(callbacks.map( function(cb) { return cb(); } ));

因為let擁有塊作用域,所以使用let聲明的變量i不會被提升到函數(shù)頂部,i的作用域在for循環(huán), 就會每次循環(huán)有獨立的值。

那我們是不是應(yīng)該不要使用var了呢?如果你想要一個變量擁有函數(shù)作用域,var還是很有用的。

讀者提到的兩個問題:

const聲明的變量不是完全不可更改。比如:

const myNotQuiteImmutableObject = {
  thisCanBeChanged: "not immutable"
};
myNotQuiteImmutableObject.thisCanBeChanged = "see I changed it.";

但是,使用const聲明可以阻止一些基本的更改,比如:

const immutableString = "you can"t change me";
immutableString = "D"OH!"; // error

如果你想要完全的不可更改,可以使用Facebook提供的Immutable庫。

老版本的瀏覽器不支持let。不僅如此,而且有些最新的瀏覽器也還沒有支持let。我們可以使用Babel來避免這個問題,Babel允許你使用所有最新的JavaScript功能,然后將其翻譯到甚至IE8都能支持的代碼。

歡迎加入我們Fundebug的JavaScript技術(shù)交流群: 622902485。

版權(quán)聲明:
轉(zhuǎn)載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/201...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/82923.html

相關(guān)文章

  • 用原生js寫一個&quot;多動癥&quot;的簡歷

    摘要:用原生寫一個多動癥的簡歷預(yù)覽地址源碼地址最近在知乎上看到方應(yīng)杭用寫了一個會動的簡歷,覺得挺好玩的,研究一下其實現(xiàn)思路,決定試試用原生來實現(xiàn)。 用原生js寫一個多動癥的簡歷 預(yù)覽地址源碼地址 最近在知乎上看到@方應(yīng)杭用vue寫了一個會動的簡歷,覺得挺好玩的,研究一下其實現(xiàn)思路,決定試試用原生js來實現(xiàn)。 showImg(https://segmentfault.com/img/remot...

    Y3G 評論0 收藏0
  • 匯總有關(guān)JS對象的創(chuàng)建與繼承

      之前也有和大家講過有關(guān)JS的對象創(chuàng)建和對象繼承,本篇文章主要為大家做個匯總和梳理。  JS中其實就是原型鏈繼承和構(gòu)造函數(shù)繼承的毛病,還有就是工廠、構(gòu)造、原型設(shè)計模式與JS繼承。 JS高級程序設(shè)計4:class繼承的重點,不只是簡簡單單的語法而已。  對象創(chuàng)建  不難發(fā)現(xiàn),每一篇都離不開工廠、構(gòu)造、原型這3種設(shè)計模式中的至少其一!  那JS為什么非要用到這種3種設(shè)計模式了呢??  我們先從對...

    3403771864 評論0 收藏0
  • 解析ES6變量賦值和基本數(shù)據(jù)類型

      let和const  let和const兩者并不存在變量提升  這里要說明的是變量一定要在聲明后使用,否則報錯?! ara=[];   for(vari=0;i<10;i++){   a[i]=function(){   console.log(i);   };   }   a[6]();//10  變量i是var聲明的,我們要知道這里在全局范圍內(nèi)都有效。我們要知道在每一次循環(huán)中,新的...

    3403771864 評論0 收藏0
  • JavaScript進階函數(shù)和對象知識點詳解

      在過往學(xué)習(xí)的JavaScript都是在基礎(chǔ),現(xiàn)在為大家介紹更為深入的JavaScript知識?! avaScript函數(shù)  JavaScript函數(shù)和Java函數(shù)是有一部分相似的,所以學(xué)習(xí)起來也會相對簡單  基本構(gòu)造  1.直接構(gòu)造  //function代表函數(shù)標(biāo)志,name為函數(shù)名稱,參數(shù)可有可無   functionname(參數(shù)){   //...   return;   }  2....

    3403771864 評論0 收藏0

發(fā)表評論

0條評論

lewinlee

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<