JS的预解析过程:
1,预解析
2,再逐行解读代码,
实例:
<script>
var name="xm";
var age=18;
function fn(argument){
console.log(name);//输出未定义:undefined
var name="xh";
var age=12;
}
</script>
解析:
全局作用域,局部作用域,都是通过以下两个步骤进行预解析的。
1,先读取有var 的变量(没有使用var的变量是不会被预解析的),给赋值为:undefined。如果两个变量重名,并不影响预解析的过程,就写一个变量就行,因为都将变量赋值为undefined(在逐行读取时,只是不同的赋值而已。),如果有函数名和变量重名,那就直接去掉变量,不进行解析。如果函数中存在参数,那么参数也一样使用var进行解析。如:var argument=undefined;
2,再读取function后面的函数—fn,如果有多个函数名重复,那么取最后面一个函数进行声明。
上面实例有两个作用域,一个是window变量对象的全局作用域,一个是fn变量对象的局部作用域。
预解析过程如下:
/*1,window:*/
var name=undefined;
var age=undefined;
function fn(argument){
console.log(name);
var name="xh";
var age=12;
}
/*2,fn:*/
var name=undefined;
var age=undefined;
var argument=undefined;
预解析就完成了。然后就是逐行解读代码。
通过逐行解读代码进行赋值,改变变量属性值。如果遇到函数,那么就直接跳过,因为预解析时已经声明过。
所以,上面实例:console.log(name); 输出为: undefined。
预解析案例:
代码解析过程,以上代码可以看成:
输出结果:
这位同学讲的挺清楚的:https://blog.csdn.net/u014205965/article/details/45620607
参考链接:https://www.cnblogs.com/Knowledge-is-infinite/p/10623172.html