引子

长久以来一直都没有专门学过 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循环,我们终于声明了 i ,但 for 循环之后,我们依然在试图使用 i 。这些代码看上去都很荒唐,或许你可能认为这段代码在第一行的时候就会报 ReferenceError 以提示我们并没有定义变量 i 并停止执行。但实际真的是这样吗?

让我们看一下这段代码的执行结果吧:

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

这段代码其实非常的谭浩强,但却说明了一个比较明