变量提升

2019-02-25  本文已影响0人  newway_001
a()
var a = c = function() {
    console.log(2)
}
//a is not a function

a()//2
function a(){// 函数声明 脚本在执行之前会做预编译处理
    console.log(2)
}

会预编译函数,对于变量,只会分配一个内存空间,不会初始化,初始化过程中会在执行时执行。

var a = c = function() {
    console.log(2)
}
a()
function a() {
    console.log(1)
}
a();
//2
//2

函数表达式覆盖掉了函数声明。

 var a=10;
    function fn(a,b){
        console.log(a)//function a(){}   这里输出function a(){}, 不是参数a的值,哈哈
        var a=10;
        console.log(a)//10
        function a(){}
        console.log(a)//10
    }
    fn(15);

对于函数而言,形参 < 函数声明,所以,第一个是输出a函数,而不是15

函数预编译相当于把函数放在环境最上方,重新定义a=10,更改了a的值

    a();//1
    var a = c = function() {
        console.log(2)
    };
    a();//2

    function a() {
        console.log(1)
    }
    a();//2
    (function(b) {
        b();//2    a传递给形参b,
        c();//2    自由变量c
        var b = c = function a() {
            console.log(3)
        }//重新定义
        b()//3
    })(a);//走到这里 a已经被赋值表达式重新赋值
    c();//3 自由变量被改变
function fn(){
        function a(){console.log(1)}
        return a;
        function a(){console.log(2)}
    }
    fn()();//2 由于预编译,2个function提到最前面

上一篇 下一篇

猜你喜欢

热点阅读