预解析
JavaScript引擎运行时,分两步
- 预解析
JavaScript会将 var 和 function 优先解析- 变量提升
只提升变量,不提升赋值 - 函数提升
只提升声明,不调用函数
- 变量提升
- 代码执行
预解析结束后,按代码从上往下执行
函数内部变量如果没有声明,直接赋值。则为全局变量
测试1
var num = 10
fun()
function fun() {
console.log(num)
var num = 20
}
结果为:
undefined
解析:
它的执行过程是
function fun() {
var num
console.log(num)
num = 10
}
var num = 10
fun()
测试2
var num = 10
function fn() {
console.log(num)
var num = 20
console.log(num)
}
fn()
结果为:
undefined
20
解析:
它的执行过程是
var = num
function fn() {
var num
console.log(num)
num = 20
console.log(num)
}
num = 10
fn()
测试3
var a = 18
f1()
function f1() {
var b = 9
console.log(a)
console.log(b)
var a = '123'
}
结果为:
undefined
9
解析:
它的执行过程是
var a
function f1() {
var b
var a
b = 9
console.log(a)
console.log(b)
a = '123'
}
a = 18
f1()
测试4
f1()
console.log(c)
console.log(b)
console.log(a)
function f1() {
var a = b = c = 9
console.log(a)
console.log(b)
console.log(c)
}
结果为:
9
9
9
9
9
报错
解析:
它的执行结果为
function f1() {
var a
a = 9
b = 9
c = 9
console.log(a)
console.log(b)
console.log(c)
}
f1()
console.log(c)
console.log(b)
console.log(a)