标签:
复习作用域,彻底的理解js的运行机制;
首先在js代码运行之前,会进行预解析,至少会进行2步:
1、找一些东西——> var、function、参数等关键字,在js运行之前会给他们一些相应的动作
比如变量会赋值 undefined;函数的内容就整个函数块;
如果遇到重名的情况下,留下函数,变量剔除;如果函数名也相同,则按照顺序
留下后面的函数;
2、逐行读取代码;
比如下面的代码,如果不理解这种机制,我就认为第一个弹出的alert里面的值是 undefined;
然而实际上第一个是 function a(){ alert(5);} 这样一个函数块本身,最终留下的是alert(4)的
这个函数;
alert(a); var a = 1; alert(a); function a(){ alert(2);} alert(a); var a = 3; alert(a); function a(){ alert(5);} alert(a);
表达式可以修改预解析的值,所以原来预解析里面的a = function a(){alert(5)} 就变成了 a=1;
当js代码逐行运行到 var a = 1 的时候;
因为表达式修改了预解析的值,所以后面的a();就会报错,为什么会报错?因为此时的预解析仓库里
已经没有函数了,原先的a 已经被赋值为3了;
alert(a); // function a(){ alert(5);} var a = 1; alert(a); // 1 function a(){ alert(2);} alert(a); // 1 var a = 3; alert(a); // 3 function a(){ alert(5);} alert(a); // 3 a(); // 报错 TypeError: a is not a function
标签:
原文地址:http://www.cnblogs.com/zhangxg/p/4570547.html