目录
1、预解析
(1)预解析就是聊聊代码的编译和执行
(2)JS是一门解释型语言,在代码执行之前,会先对代码进行通读和解释,然后再执行代码
(3)也就是说JS代码在运行的时候,会经历两个阶段“解释代码”和“执行代码”
2、var关键字的预解析
先看两个例子:
(1)定义变量myName,并在变量定义之前就调用一次该变量
<script>
console.log(myName) // myName变量在后文中被定义和赋值
var myName="abc"
console.log(myName)
</script>
输出如下:
(2)但如果调用的是一个在后文中也没有被定义和赋值的变量时:
<script>
console.log(myAge) // myAge变量在后文并没有被定义和赋值
var myName="abc"
console.log(myName)
</script>
输出如下:第一次输出时变量myAge未被定义也未被赋值,所以会报错
综上,在预解析时,会先把var关键字定义的变量都放到最前面先声明一下,及上述第一个例子经过var预解析会变成类似如下形式:
var myName
<script>
console.log(myName)
myName="abc"
console.log(myName)
</script>
所以在第一个例子中由于myName变量的定义在预解析时被提到了前面,所以第一次调用时会输出undefined,表明myName变量此时只被定义了还未被赋值。
3、赋值式函数的预解析
赋值式函数预解析同var关键字预解析一样,会先把函数声明提到最前面,因为赋值式函数也是利用var关键字定义的。举例说明:
<script>
fn()
var fn=function(){
console.log("fn")
}
fn()
</script>
输出如下:由于在预解析时只把函数声明提到了前面(把var fn提到前面),所以第一次调用时fn只是一个普通变量,还未被定义为函数,所以在调用fn()时会出错
4、声明式函数的预解析
<script>
test()
function test(){
console.log("test")
}
test()
</script>
输出如下:
所以,对于声明式函数,会在预解析时把声明式函数提到前面。上述声明式函数在预解析时会变成类似如下形式:
function test(){
console.log("test")
}
<script>
test()
test()
</script>
所以在第一次调用test()时,就能输出test