函数优先法则

众所周知,在ES5的规则下,使用var声明变量,变量会提升,函数亦是如此,但是如果碰到函数名和变量名是同一个的情况下,代码会如何执行呢?先看下面的例子

foo(); //1
var foo;
//这是一个函数声明
function foo(){
    console.log(1);
};
// 这是一个函数表达式,不会提升,如果是一个函数声明则会提升
foo = function(){
    console.log(2)
}

上面的代码会输出 1 而不是 2,原因就是函数的提升 由于变量的提升,这段代码会被引擎理解为如下代码

function foo(){
    console.log(1);
}
foo();//1
foo = function(){
    console.log(2)
}

/*
ps: var foo 虽然在  function foo(){...}的声明之前,但它是重复声明,会被忽略
*/

二、函数的声明会覆盖前面已有的函数声明

// 此段代码的输出结果是 3
foo();//3
function foo(){
    console.log(1)
};
var foo = function(){
    console.log(2)
};
function foo(){
    console.log(3)
};

/* 上面的代码会被引擎理解为*/

function foo(){
    console.log(3);
};
foo();//3
// 注:此段代码不会提升,因为这是函数表达式,而不是函数声明
foo = function(){
    console.log(2)
}
foo();//2

再来个例子巩固下上面的

    console.log(foo());//3
    function foo(){
        return 1;
    }
    console.log(foo());//3
    foo = function(){
        return 2;
    };
    function foo(){
        return 3;
    };
    console.log(foo());//2

/*此段代码会被引擎解析成 function foo(){return 1;} 被覆盖了*/

function foo(){
    return 3;
}
console.log(foo());//3
console.log(foo()); //3
foo = function(){
    return 2;
};
console.log(foo());//2

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值