var a = 10
会被看作两个部分
var a
a = 10
第一个部分是预编译阶段的任务,第二个阶段是执行阶段的任务,而且预编译阶段会将所有的变量进行提升。
- 如果是函数声明,那么预编译阶段会被赋值,而函数表达式在这个阶段不会被赋值
- 如果是具名的函数表达式,那么名称标识符不会被提升,例如:
foo() // TypeError
test() // ReferenceError
var foo = function test () {}
- 将函数声明在
{}
这种块内部,不会被提升,例如:
foo() // TypeError: foo is not a function
var a = true
if (a) {
function foo () {}
}