日期:2014-05-16 浏览次数:20362 次
一。javascript的预编译
javascript是完全静态的么?
不是。也就是说javascript并不是简单的按照代码一行一行挨个往下执行。
?
对于解释执行语言,肯定不会编译成什么中间语言。大概过程如下:
#1 建立全局对象
??? 为执行环境(一个html页面,框架环境下有几个执行环境)建立建立一个全局对象,一般客户端脚本为 window或global对象。(在这我觉得global好理解,因为浏览器会放入window和其他的属性)
#2 检查根对象的全局var变量,设置为全局对象的属性,属性值为undefined
?? 检查某环境中根代码块中(非函数中,非{}中)var关键字,把这些变量设置成global对象的属性,并附初值为:undefined;
?? 注意:没有var修饰的就略过去了;
?? 注意:这里仅仅是预编译,这些var变量的真正初值需要执行到代码行时才定下来;也就是说未执行至真正的初值初始化行时,这些属性值一直为undefined
#3 检查全局函数,设置为全局对象的属性,并初始化
??? 如果过程中遇到直接定义的函数(function的定义),设置成global对象的属性,并附初值函数的定义。
??? 注意:这里真正的初始化了!不同于#2.
?
再强调一次,这里只是类似的预编译,相当于c语言中的原型定义,方便后面调用,这些预编译的东西并不执行,也不检查错误,并不是java中的预编译。
?
?
二。 以函数作为变量作用域的分界
java等语言中以块来区分变量的作用域,但javascript中没有块作用域,只有函数作用域。
也就是说,函数内同时不在嵌套的函数内,的变量都是在一个作用域中,不管是在块内还是块外。
?
三。词法作用域
?
?
有个疑问,为啥javascript没有一个官方的文档,说清楚这些东西是怎么回事。《javascript权威编程》《javascript权威指南》好像是顶级的书了,但看看,连个变量也没说清楚。
?
整个一个乱象,谁想怎么实现就怎么实现,谁想怎么处理就怎么处理。这些逻辑好像都是试出来的,有多少还没有试出来,谁知道!
?
程序员浪费时间搞这些事情,真是一种浪费呀!
?
K
-
K
-
K
-
K
?