首先上图

函数a是函数声明,执行的是函数提升,实际效果是
function a() {
console.log(1);
}
a();
即会把整个函数声明提到作用域顶端
而函数b是函数表达式,执行的是变量提升,实际效果是
var b;
b();
b = function() {}
由于b已经声明了,所以不会报错ReferenceError,而是TypeError。
另外补充一点,函数声明和变量声明都会被提升。但是函数会首先被提升,其次才是变量。
foo();
var foo;
function foo() {
console.log(1);
}
foo = function() {
console.log(2);
};
猜猜会是什么结果?

会输出1而不是2
该代码片段会被引擎理解为如下形式
function foo() {
console.log(1);
}
foo();
foo = function() {
console.log(2);
};
var foo尽管出现在function foo() {}的声明之前,但是函数声明会被提升到普通变量之前。重复的var声明被忽略。
但是出现在后面函数声明却可以覆盖前面的函数声明
foo(); //2
function foo() {
console.log(1);
}
function foo() {
console.log(2);
}
这也许是无用的理论,但是它说明了一点,在同一个作用域内做重复定义很容易出问题。
本文解析了JavaScript中函数声明与函数表达式的提升机制,并通过实例展示了两者之间的区别,还深入探讨了函数声明与变量声明的提升顺序。
256

被折叠的 条评论
为什么被折叠?



