注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

星期五

明天不上班

 
 
 

日志

 
 
关于我

一个特立独行的Java程序员,比较宅,上上网,写博客,听音乐,看电影。

网易考拉推荐

JavaScript预解析和逐行执行  

2014-05-17 12:23:33|  分类: Javascript |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
JavaScript的预解析其实就是英文概念里的Hoisting,意思就是提升的意思,是在JavaScript在逐行执行代码之前进行的预处理,将以关键字var和function开头的语句块提前进行处理。
对function的处理,直接将其提升到所有代码之前,所以你可以这样写:
//相当于将函数处理成: foo = function() {console.log("This is a foo function")}
foo();
//alert(foo);// function foo
function foo(){
console.log("This is a foo function");
}

对var的处理,对变量声明提升到所有代码之前,并对其赋值为undefined所以你可以这样写:

//相当于将变量处理成: foo = undefined;

alert(foo); //undefined

var foo = 2;

如果遇到相同的变量的var 声明,预解析将只保留一个

alert(foo)

var foo = 2;

var foo = 3;

如果遇到函数和变量var声明相同的时候,则只保留函数,如果同为函数则自下向上覆盖

alert(foo); //function foo(){}

function foo(){}

var foo = 2;

更为复杂的情况是,遇到函数中含有var 和 function, 并且函数执行,JavaScript预解析又会怎样处理,这里又牵扯到函数执行的机制。函数执行可以认为(个人猜想)又进行了一次预解析和逐行执行看个例子

alert(foo); //function foo(){... ...}

function foo(){

alert (foo); //undefined

var foo = 3

}

foo();

var foo = 2;

上面的函数foo()执行,函数内部(注意函数内部是一个作用域)进行了预解析,将foo进行了提升,但是这个foo是foo函数里面预解析的变量,所以是undefined而不是function,在修改一下上面的程序

alert(foo); //function foo(){....}
function foo(foo){
alert (foo); //function foo(){....}
var foo = 3

foo = 2;//这里的赋值,是指该函数内部的foo变量,不是只外面的foo变量

}
foo(foo); //传入了function foo

alert(foo);//function foo(){....}

上面函数传入了参数,在函数预解析时,对foo,进行了提升,但是在行分析时,参数可以理解成var foo = undefined,但是传入了参数foo, 对其进行了赋值,foo其实就是外层作用域的预解析的foo函数。所以你看到结果就都是函数foo

关于这块更深入的了解,建议参看这两篇文章
http://www.imooc.com/article/2487
http://davidshariff.com/blog/what-is-the-execution-context-in-javascript/

参考资料:
http://www.it165.net/pro/html/201404/12950.html
http://www.zhihu.com/question/21517000/answer/18478914

  评论这张
 
阅读(588)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017