函数声明,函数表达式,变量

js 中首先将变量声明及函数声明提升至当前作用域的顶端。

 

1.而函数声明提升又是优于变量声明提升的

2.并且同名函数声明会被后者覆盖

3.同名变量声明会被跳过

4.函数表达式等同于变量

 

这四句记住了,关于声明提升的问题就不是问题了。

举几个比较经典的例子。

1.

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

声明提升后相当于

function a() {}   //  1. 函数声明优于变量声明
var a;      // 被挑过 2.同名变量声明会被跳过 
console.log(a)   //   function a(){}
a =1;    

2.

var bar = function () {
    console.log(4);
};
function bar() {
    console.log(5);
}

bar();  //4

提升后相当于

function bar() {
    console.log(5);
}  
var bar; 
bar = function () {
    console.log(4);
};

bar();  //4

3.

1    foo(); // 2

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

3   foo(); // 1

4    function foo() {
        console.log(2);
    }

5   foo(); // 1

相当于原来的第二步拆成了两步

4    function foo() {
        console.log(2);
    }
2    var foo ;

1   foo(); // 2

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

3    foo(); // 1

    
5   foo(); // 1

为什么要提升,可以看看Dmitry Soshnikov之前的一篇文章

函数提升就是为了解决相互递归的问题,大体上可以解决像ML语言这样自下而上的顺序问题。

变量提升是人为实现的问题,而函数提升在当初设计时是有目的的。

posted @ 2018-10-11 16:34  been101  阅读(260)  评论(0编辑  收藏  举报