JS之预解析

今天又学了新知识,很开心,希望自己每天多懂一点点,多多积累。今天呢学习的就是js的预解析啦~

JS预解析

什么是预解析呢?就是浏览器的准备工作,把变量,函数表达式的声明提到当前作用域的顶端。

例1.

function t2() {

    console.log(a);

    var a = 30;

} t2();

预解析为:

 function t2(){

    var a,

    console.log(a);

    a = 30;

} t2();

这一个函数表达式,它是局部作用域,把变量a提到当前局部作用域的顶端,在js中是从上到下解析的,在这里我们声明了a,但是却没有给a赋值,所以console.log(a)的值为undefined


例2.

for(var i = 0;i<5;i++){


}

console.log(i)

这是一个for循环语句,它的预解析是:

var i 

for(i = 0; i < 5 ; i++){

    console.log(i)

}

注意注意!for循环语句和if判断语句里定义的是全局作用域!!!只有函数里可以定义局部作用域
因为它是全局作用域,函数内部也可以访问到,所以console.iog(i)的值为0,1,2,3,4


例3.

var i = dream;

(function(){

    console.log(i)

    var i =star

})()

这是一个匿名函数变成函数表达式,那预解析为:

var i = dream;

(function(){

    var i

    console.log(i)

    i =star

})()

函数表达式里是局部作用域,所以局部里的声明提到当前作用域的顶端,此时console.log(i)的值还是为undefined,因为能找到i但是没有给i赋值

  • 把匿名函数变为函数表达式:()()两个括号,第一个括号放匿名函数,作用是把匿名函数转化为函数表达式。第二个括号就是立即执行,参照例3
Share