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语言这样自下而上的顺序问题。
变量提升是人为实现的问题,而函数提升在当初设计时是有目的的。