這裏咱們不討論做用域鏈的問題,這些問題您能夠看下我以前寫的東西,經過這一段代碼,讓咱們從新認識JavaScript。
這回咱們主要來分享一下,JavaScript中做用域的建立方式。es6
經過理解代碼來記住知識點是最快的,面試官問道相似的問題的時候,舉個代碼的例子就你們都懂了,賽過任何含糊的概念描述,因此咱們來看一下這個代碼的例子吧。面試
請思考輸出結果,for循環的{}能建立一個做用域嗎?segmentfault
for (var i = 0; i < 2; i++) { console.log("in for:"+i); } console.log("out for:"+i);
請思考代碼運行結果,function應該能建立做用域吧?babel
function forscope(){ for (var i = 0; i < 2; i++) { console.log("in for:"+i); } }; forscope(); console.log("out for:"+i);
爲何這樣寫會更好呢?編輯器
(function(){ for (var i = 0; i < 2; i++) { console.log("in for:"+i); } })(); console.log("out for:"+i);
老外說,這樣子寫纔是最佳實踐,您看出來門道了嗎?函數
(function forscope(){ for (var i = 0; i < 2; i++) { console.log("in for:"+i); } })(); console.log("out for:"+i);
這樣寫太鬼了吧?網站
try{ undefined(); }catch(i){ for (i = 0; i < 2; i++) { console.log("in for:"+i); } } console.log("out for:"+i);
如今能體會到es6中let存在的意義了吧?code
for (let i = 0; i < 2; i++) { console.log("in for:"+i); } console.log("out for:"+i);
聽說這纔是最佳實踐!ip
{ let i; for (i = 0; i < 2; i++) { console.log("in for:"+i); } } console.log("out for:"+i);
function,try catch都可以建立做用域,可使用它們來更好地保護代碼細節,通常仍是用function,try catch通常是代碼轉換器會用的。作用域
當即執行函數(function(){...})();是個不錯的選擇,但具名的當即執行函數可讓代碼自己更具備可讀性,是個最佳實踐(function forscope(){...})();。
es6中let能夠隱式地和最近的{}一塊兒建立一個做用域,但顯示地建立可以方便以後代碼塊的移動,是個最佳實踐。
參考書
《你不知道的JavaScript(上卷)》第一部分,亞馬遜電子書9.9元,強力推薦
網站