今天又学了新知识,很开心,希望自己每天多懂一点点,多多积累。今天呢学习的就是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