函数定义语句中函数被显式地"提前"到了脚本或函数地顶部。因此它们在整个脚本和函数内部都是可见的。使用var地话只有变量声明提前了--变量初始化代码仍然在原来地位置。
函数定义被提前
在脚本里和函数内部无论在哪个地方定义了函数,其他地方都能够访问。当然,可以举个例子说明。我们定义一个长函数:
> result = function() {
... var b = a;
... b();
... function a() {
..... console.log("I am a!!");
..... }
... }
[Function]
> result()
I am a!!
例子说明了这句话:
函数定义语句中函数被显式地"提前"到了脚本或函数地顶部。因此它们在整个脚本和函数内部都是可见的。
上面例子中函数a
在变量b
后面被定义。但是我们函数体内第一句话就已经吧函数a
赋值给b
;并在第2句话调用函数b
。如果函数的定义没有被提前的话这样来说应该会报错才对。事实上并没有报错。证明了函数定义会被提前到函数的顶部。脚本级别的函数也是如此。这里不冗余了。
变量声明被提前
这里变量声明被提前相对于函数定义被提前又稍微复杂一点。因为变量的规则是 使用var地话只有变量声明提前了--变量初始化代码仍然在原来地位置。。这个其实也很好证明。我们在node里面定义一个函数。
> var variable = "Hello World";
undefined
> function testVariable() {
... console.log(variable);
... var variable;
... console.log(variable);
... variable = "Happy Coding";
... console.log(variable);
... }
undefined
然后调用这个函数:
> testVariable()
undefined
undefined
Happy Coding
得到了很梦幻的结果。容小弟来解释一下。
- 我们在函数外面声明了变量
variable
,由于函数内部也通过var声明了同名变量。所以外部的全局变量被局部变量覆盖掉了。之所以这里是undefined
是由于var声明被提前了。 - 这里
variable
也是undefined
是由于,我们在1处已经声明了变量。两者直接并没有任何的副作用语句,所以它现在的值依然是undefined
。 - 由于打印之前对变量进行赋值操作。所以现在变量的值是
Happy Coding
。
这个例子很好证明了:
使用var的话只有变量声明提前了--变量初始化代码仍然在原来的位置。