先看一个例子
var i=10;
function test(){
alert(i);
var i = 5;
}
test();//输出undefined
//预解析将 全局i和 test里面的i 都初始化为 undefined。 所以当 去掉test里面的 i 变量 将输出 10
如果你认为这个输出有问题的话,就有必要继续看下去了。
输出结果是undefined, 这种现象被称成“预解析”:JavaScript引擎会优先解析var变量和function定义。在预解析完成后,才会执行代码。如果一个文档流中包含多个script代码段(用script标签分隔的js代码或引入的js文件),运行顺序是:
step1. 读入第一个代码段,JavaScript执行引擎并非一行一行地执行程序,而是一段一段地分析执行的(以<\script\>标签来分割)
step2. 做语法分析,有错则报语法错误(比如括号不匹配等),并跳转到step5
step3. 对var变量做声明(初始为undefined)和function定义做“预解析”(永远不会报错的,因为只解析正确的声明)
step4. 执行代码段,有错则报错(比如变量未定义)
step5. 如果还有下一个代码段,则读入下一个代码段,重复step2
step6. 结束
在看几个小例子
alert(i);
var i = 1;
弹出undefined。预编译的时候,声明了变量i;执行到alert(i)这行代码的时候,i尚未被赋值,所以弹出undefined
alert(test1);//弹出function test1(){}
function test1(){}
alert(test2);//弹出undefined
var test2 =function(){};
对var变量做声明(初始为undefined)和function定义做“预解析”
下面看几个特殊的例子
alert(i);
i=10;
执行报错,i未定义。
alert(i);
eval("var i = 5;");
执行报错,i未定义。
小结
step3中所谓的“预解析”,其实是在step2的语法分析阶段完成,并存储在语法树中。当执行到函数实例时,会将varDelcs和funcDecls从语法树中复制到执行环境的scriptObject上。
step4中,未定义变量意味着在scriptObject的变量表中找不到,JS引擎会沿着scriptObject的upvalue往上寻找,如果都没找到,对于写操作i = 1; 最后就会等价为 window.i = 1; 给window对象新增了一个属性。对于读操作,如果一直追溯到全局执行环境的scriptObject上都找不到,就会产生运行期错误。
但需要注意,with和eval的语义无法仅通过静态技术实现,实际上,只能说JS的作用域机制非常接近lexical scope.
原文地址
http://leeldy.blog.163.com/blog/static/13985306201061325918669/
http://hi.baidu.com/lcgg110/blog/item/27c18bfa2a96908359ee908a.html
分享到:
相关推荐
浅析javascript原型继承机制,浅析javascript原型继承机制
浅析MFC程序基本运行机制. The Analysis Of Basic MFC Program Running Principle
浅析我国大学科技园的管理模式和运行机制,宋思利,张兆亮,文章对我国大学科技园的经营管理模式、运行机制等进行了客观分析,并对现阶段国内大学科技园普遍采用的管理模式和运行机制做了简
NAT地址转换浅析_席东.pdf
浅析社区养老服务机构运行机制-论文.zip
浅析法国高等教育评估运行机制及其启示.pdf
浅析Javascript原型继承,浅析Javascript原型继承
浅析人才激励机制的意义.doc
主要介绍了浅析js实现网页截图的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
HTTP协议是浏览器和服务器双方共同遵循的规范.是一种基于TCP/IP(传输层协议,相对应的有UDP)的"应用层协议" PS:TCP/UDP是广泛使用的网络通信协议,UDP协议具有不可靠性和不安全性, 相对来说TCP协议是基于连接和三次...
浅析Wakelock机制与Android电源管理.pdf
浅析Android手机传感器机制及应用设计举例.pdf
浅析资金运行管理改革.docx
浅析设备运行分析制度.doc
java实现word文档到xml文档转换浅析
浅析局域网运行应急预案方案.pdf
浅析信息反馈机制在智能交通系统中的应用.pdf
Qt事件机制浅析
#资源达人分享计划#