日期:2014-05-16  浏览次数:20362 次

javascript_变量作用域_小结


一。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

?