西红柿爱番茄

Feed Rss

javasript预读机制小析

07.22.2010, Javascript, by .

javasript的预读机制说的直白点就是其他语言中所谓的“编译”,在代码运行之前对代码进行review一遍,把一些使用var和function声明的变量和函数提起读进内存里,并分配空间,初始化为undefined。等到代码运行的时候再进行相应的赋值。

简单的预读原理,相信很多人都已经知道了,比如:
[javascript]
alert(test); //output:undefined
var test = "supersha";
//=========================
alert(typeof fn); //output:function
function fn(){}
//=========================
alert(typeof fn2); //output:undefined
var fn2 = function(){}
[/javascript]

上面是非常普通的原理,大家都能理解。但是有两个对于新手来说比较难懂的方面:“函数第一,变量第二”、“作用域环境”。

“函数第一、变量第二”,在这里的意思是在预读过程中,当遇到使用function声明的函数的时候,会先预读,即时后面使用var声明了同名的变量,也不会在内存中覆盖;而使用var声明的变量会受到后面使用var声明的同名变量的覆盖。需要注意的是,使用var的形式声明的函数字面量在预读的时候也是被当作一个变量来对待,它会受到同名变量的覆盖。但是,这里所的覆盖有一个大前提,需要在同一个作用域内。这就是“作用域环境”的意思,需要明白这点:在不同的作用域内,使用var声明的同名变量、函数在预读的时候是互相不干扰的。比如:

[javascript]
var url = "www.ilovejs.net";
function fn(){
alert(url); //output:undefined
var url = "www.ilovejs.com";
alert(url); //output:www.ilovejs.com
}
fn();
alert(url); //output:www.ilovejs.ne
[/javascript]
上面的情况就涉及到作用域环境的问题了,两个使用var声明的url变量在不同的作用域内,相当于“独立”的变量,互相不干扰。

javasript预读机制小析 有 4 条回应

  1. 过来看看你!

  2. 好文章,每天都来看看

  3. 感觉js中function只是加载,并不执行、、、

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>