首先上图
函数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);
}
这也许是无用的理论,但是它说明了一点,在同一个作用域内做重复定义很容易出问题。