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