javascript 变量作用域
套用一句非常经典的话“人是人他妈生的,妖是妖他妈生的”,与之一样“全局变量具有全局的作用域,局部变量具有局部变量的作用域”
javascript 中在函数中声明的变量属于局部变量。那么如果一个函数的定义是嵌套在另一个函数中呢(也就是闭包)?
很简单,继续套用上面的话,嵌套的函数中声明的变量就具有嵌套的局部作用域。
在js中,全局变量是全局对象的属性,而局部变量是一个特殊的调用对象的属性。
让我们来看一下啥叫变量的作用域,关注一下其表示法,如何对它进行再定义。
每个JavaScript执行环境都有一个和它关联在一起的作用域链。这个作用域链是一个对象列表或对象链。
当JavaScript代码需要查询变量x的值时,这其实是一个称为变量名解析的过程。
它就开始查看该链的第一个对象。如果那个对象有一个名为x的属性,那么就采用这个属性的值。
如果第一个对象没有名为x属性,则继续查询链中的第二个对象。
如果第二个对象也没有名为x属性,那么就继续查下一个。。。(别逼我数到一百哈)
其实在不属于任何函数定义的代码中——那就是单纯定义变量的地方,或者也可以说是定义全局变量的地方。
作用域链只由一个对象构成,不用说了吧?就是全局对象。
所有的变量都是在全局对象中查询的。如果一个变量并不存在,那么其值就是undefined。因为没有找到嘛。呵。
在一个非闭包函数中,作用域链是啥东西组成的呢?嘿嘿。。
你别说只有局部对象哈。除非你把全局对象给吃了。。嗯。。
没错,在一个非闭包函数中,作用域链是由两个对象组成的——函数本身的调用对象,全局对象。
所以,当函数引用一个变量时,首先检查的是调用对象(局部作用域),其次才检查全局对象(全局作用域)。
这可以理解为,要找一个孩子,当然找到他父母是最方便的,如果其父母说这不是我的孩子。那么就去问他爷爷吧。
比喻不是很恰当,大家试着接受一下哈。
下图说明了在一个函数的作用域链中查找一个变量名的过程(这可是闭包函数的例子哦)
文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/05/29/660/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

一个函数的定义是嵌套在另一个函数中,这是js的特色吧
[回复]
@荒野无灯
嗯。应该是吧,至少我在别的编程语言里没有见到过。呵呵。。
貌似SHELL可以?记不清了。
[回复]
好多字啊~~变量名解析&&查询,这样说得很到位,java就是一个解释执行的语言
[回复]