I am houbiao beta 0.1

javascript学习笔记之Precompiled(预编译机制)

分类:Self

预编译,没错,js也是预编译语言,以下把自己学习时用到的资料整理一下,当作复习了。

1.js在页面加载过程中顺序执行。但是分块预编译、执行。

2.js在执行前会进行类似“预编译”的操作,而且先预声明变量再预定义函数。

此时注意,是声明,不是定义,如:var a = 1; 在预编译中,只是执行了var a;没有赋值,即在预编译结束时a = undefined;

3.(注意)并不是先全文编译完在执行,而是块编译,即一个script块中,预编译再执行,然后(按顺序)下一个script块,预编译再执行,但此时上一个块中的数据都是可以用的,但下一个块中的函数,声明的变量都是不可用的。

4.变量没声明就引用,会报错(is not defined),但对象方法,对象变量没声明,是undefined。

5.在函数中变量不声明就赋值,会被认为是全局变量,用var声明后为函数变量

6.在执行函数时也是先编译后执行,但要注意函数定义中(即大括号中)的代码即使有错只要函数不执行,就不会有影响,但一执行函数,开始函数预编译就会出错。

再看下边的例子:function funA(){ }这种形式是声明一个函数,跟 var 一个变量的机制一样,脚本在解释执行之前会做预编译处理,而var funA = function(){ }这种形式是对一个变量赋值,虽然也做预编译,但仅仅只是给 funA 事先变量分配一个内存空间,而没有做初始化。

亲自试下window.alert(funB);function funB(){ }可以看到弹出的提示框显示的是funB的内容,虽然alert是在 function 声明之前的,但是不影响,这就验证了执行之前脚本被做了预编译处理。

再看window.alert(funC);var funC = 123;以上代码会弹出undefined,这说明脚本在预编译处理的时候对var变量虽然也处理了,但是只是留出了内存空间,并没有初始化(赋值),这与var funC;是一样的。

在试一例window.alert(funD);window.alert(numD);if(true){function funE(){ }var numE = 1;}else{function funD(){ }var numD = 2;}以上代码再次验证了预编译,并且说明预编译与条件无关。先弹出funD的函数定义,再弹出undefined。不过这段代码在火狐(ver22.0)下面会报错 funD未定义,不排除高版本的修正过来,在chrome 和ie下确实是先弹出funD的函数定义再弹出undefined。

最后说下js预编译的顺序问题,测试代码:alert(typeof funF);var funF = "variable";function funF(){ }alert(funF);没错,执行结果依次是"function"和"variable"。

js解析器先预定义了 funF 变量为 undefined, 但是 funF 函数覆盖了此变量,因此一开始执行结果是 function,然后 funF 被赋值为 "variable",因此最后执行结果是 "variable",so,如果上面的代码将var定义与function上下调换位置,结果也还是一样的。结果说明:js解析器先预声明变量,再预定义函数,并且可以覆盖之前的同名声明。

3887 reads 2 comments

上一篇:纪念coding的青葱岁月。

回复信息

random_guy

Hey, sorry i cannot understand chinese, so it wont be related to the post.

2 mistakes on your site :

"commons" = should be "comments"

"submit commons" = should be "submit comment"

Pretty cool site tho. Nice minimal design.

 

Cheers!

devqin

有深度、

Leave a comment

*