引子
長久以來一直都沒有專門學過 JS ,因為之前有自己啃過 C++ ,又打過一段時間的算法競賽(寫得一手好意大利面條),于是自己折騰自己的網站的時候,一直都把 JS 當 C 寫。但寫的時候總會遇到一些奇怪的問題,于是打算花點時間看了看《你不知道的JavaScript》。寫這篇文章以記錄一下一段時間的學習內容,也治療一下我不愛做筆記和總結的毛病。如果你也是一直按著別的語言的編程習慣來寫 JS 而沒有專門去了解過它,不妨一起來了解一下 JS 的一些獨特之處。
首先來看一段代碼:
"use strict"; // 這篇文章的示例代碼均在嚴格模式下運行,如果您不知道什么是嚴格模式,下面有一個段落有概述console.log("Firstly, i = " + i);// console.log("BTW, a = " + a);i = 61;console.log("Then there it got a value, i = " + i);for(var i = 1; i <= 5; i++) { console.log("In for loop, i = " + i);}console.log("At the end, i = " + i);
你可能注意到,這段代碼一開始就要輸出 i 的值,而在輸出之前我們似乎并沒有寫任何聲明和定義 i 值的語句,而再之后,我們給 i 賦了一個值,但我們依然沒有用 var 之類的關鍵字來做變量聲明的工作。在for循環(huán),我們終于聲明了 i ,但 for 循環(huán)之后,我們依然在試圖使用 i 。這些代碼看上去都很荒唐,或許你可能認為這段代碼在第一行的時候就會報 ReferenceError 以提示我們并沒有定義變量 i 并停止執(zhí)行。但實際真的是這樣嗎?
讓我們看一下這段代碼的執(zhí)行結果吧:
Firstly, i = undefinedThen there it got a value, i = 61In for loop, i = 1In for loop, i = 2In for loop, i = 3In for loop, i = 4In for loop, i = 5At the end, i = 6
這段代碼其實非常的譚浩強,但卻說明了一個比較明