JavaScriptWeb前端之路程序员

Javascript 声明提前

2016-07-20  本文已影响172人  lanzhiheng

函数定义语句中函数被显式地"提前"到了脚本或函数地顶部。因此它们在整个脚本和函数内部都是可见的。使用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

得到了很梦幻的结果。容小弟来解释一下。

  1. 我们在函数外面声明了变量variable,由于函数内部也通过var声明了同名变量。所以外部的全局变量被局部变量覆盖掉了。之所以这里是undefined是由于var声明被提前了。
  2. 这里variable也是undefined是由于,我们在1处已经声明了变量。两者直接并没有任何的副作用语句,所以它现在的值依然是undefined
  3. 由于打印之前对变量进行赋值操作。所以现在变量的值是Happy Coding

这个例子很好证明了:

使用var的话只有变量声明提前了--变量初始化代码仍然在原来的位置。

Happy Coding _

上一篇下一篇

猜你喜欢

热点阅读