函数和变量提升

在 你不知道的JavaScript(上卷) 一书的第40页中写到:函数会首先被提升,然后才是变量。

console.log(foo);   
function foo(){
    console.log("函数声明");
}
var foo = "变量";

输出为:

function foo(){
    console.log("函数声明");
}

迅雷面试考察:所以是函数首先被提升,然后才是变量

函数提升优先级比变量提升要高,且不会被变量声明覆盖,但是会被变量赋值覆盖,所以你上面的代码实际上是

function foo(){
    console.log("函数声明");
}
var foo;
console.log(foo);   
foo = "变量";

在最后再加上打印就能看到函数已经被覆盖了。
注:初始化变量不会把值也提上上去,只会提升变量的声明。

注意:只有函数声明提升,函数表达式不会提升

var foo = function () {
   console.log("1");
}//函数表达式不会提升

注意

(1) 如果在同一个作用域中存在多个同名函数声明,后面出现的将会覆盖前面的函数声明
(2)分析变量提升和函数提升时,将代码改写,再分析。比如:

var foo = 3;
function hoistVariable() {
    var foo = foo || 5;
    console.log(foo); // 5
}
hoistVariable();

相当于:

var foo = 3;

//预编译之后
function hoistVariable() {
    var foo;
    foo = foo || 5;
    console.log(foo); // 5
}
hoistVariable();

(3)通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用域的顶端,然后进行接下来的处理。
(4)所以无论是早期的代码,还是ES6中的代码,我们都需要遵循一点,先声明,后使用。
(5)JavaScript中的函数是一等公民,函数声明的优先级最高,会被提升至当前作用域最顶端

面试问题二:为什么要进行提升?
函数提升就是为了解决相互递归的问题

参考:http://www.cnblogs.com/liuhe688/p/5891273.html

你可能感兴趣的:(面试题链接)