变量和函数的提升
- 变量提升:把var声明的变量提升到当前作用域的顶部,只提升声明,不提升赋值
alert(a)
var a = 10
// 上面两行代码完成变量提升以后相当于是下面这三行
var a
alert(a)
a = 10 //undefined
JS运行和编译
-
语法分析
查找基本语法有没有错误 -
预解析
1:执行之前进行预解析
2:var、function关键字提前到当前作用域的顶部,变量默认值为undefined,函数默认值为函数体代码块,当函数与变量重名时,保留函数。 -
解释执行
console.log(b) // 报错,b is not undefined ,因为b不会提升
b = 20
//变量提升是提升到当前作用域的顶部
var x = 20
function fn () {
console.log(x)
var x = 10
}
fn()
// 上面代码完成变量提升以后相当于是下面的代码
// 所以函数内部访问x,那么优先访问自己的布局变量x,所以输出undefined
var x = 20
function fn () {
var x
console.log(x)
x = 10
}
fn()
fn()
// function 关键字声明的函数会提升整个函数体到当前作用域的顶部
function fn () {
console.log(123)
}
fn() //fn()放在函数前面,后面都可以
test() // 报错
// 这种方式声明的函数只提升声明,不会提升函数体
var test = function () {
console.log(456)
}
test()
注意:这种命名函数体,把test()放在前面不会提升,只是把var test提到前面了,并没有赋值,会报错