变量提升:
例1:
a = 2
var a
console.log(a) // 2
编译阶段的顺序是:
var a
a = 2
console.log(a) // 2
例2:
console.log(a) // undefined
var a = 2
编译阶段的顺序是:
var a
console.log(a) // undefined
a = 2
函数提升:
例1:
foo()
function foo () {
console.log(a) // undefined
var a = 2
}
编译阶段的顺序是:
function foo () {
var a
console.log(a)
a = 2
}
foo()
例2:
foo()
bar()
var foo = function bar () {
// ...
}
编译阶段的顺序:
var foo
foo()
bar()
foo = function () {
var bar = ...self...
//...
}
函数优先:
例1:
foo() // 1
var foo
function foo () {
console.log(a)
}
foo = function() {
console.log(2)
}
编译阶段的顺序:
function foo (){
console.log(1)
}
foo()
foo = function(){
console.log(2)
}
函数优先,所以var foo在function foo (){}的后面,此时已经有了foo声明,var 因为重复被忽略