Javascript 声明提前

作者: lanzhiheng | 来源:发表于2016-07-20 23:33 被阅读172次

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

    相关文章

      网友评论

        本文标题:Javascript 声明提前

        本文链接:https://www.haomeiwen.com/subject/dufbjttx.html