首页 > JavaScript > javascript 变量作用域
2009五月29

javascript 变量作用域

套用一句非常经典的话“人是人他妈生的,妖是妖他妈生的”,与之一样“全局变量具有全局的作用域,局部变量具有局部变量的作用域”

javascript 中在函数中声明的变量属于局部变量。那么如果一个函数的定义是嵌套在另一个函数中呢(也就是闭包)?

很简单,继续套用上面的话,嵌套的函数中声明的变量就具有嵌套的局部作用域。

在js中,全局变量是全局对象的属性,而局部变量是一个特殊的调用对象的属性。

让我们来看一下啥叫变量的作用域,关注一下其表示法,如何对它进行再定义。

每个JavaScript执行环境都有一个和它关联在一起的作用域链。这个作用域链是一个对象列表或对象链。

当JavaScript代码需要查询变量x的值时,这其实是一个称为变量名解析的过程。

它就开始查看该链的第一个对象。如果那个对象有一个名为x的属性,那么就采用这个属性的值。

如果第一个对象没有名为x属性,则继续查询链中的第二个对象。

如果第二个对象也没有名为x属性,那么就继续查下一个。。。(别逼我数到一百哈)


其实在不属于任何函数定义的代码中——那就是单纯定义变量的地方,或者也可以说是定义全局变量的地方。

作用域链只由一个对象构成,不用说了吧?就是全局对象。

所有的变量都是在全局对象中查询的。如果一个变量并不存在,那么其值就是undefined。因为没有找到嘛。呵。

在一个非闭包函数中,作用域链是啥东西组成的呢?嘿嘿。。

你别说只有局部对象哈。除非你把全局对象给吃了。。嗯。。

没错,在一个非闭包函数中,作用域链是由两个对象组成的——函数本身的调用对象,全局对象。

所以,当函数引用一个变量时,首先检查的是调用对象(局部作用域),其次才检查全局对象(全局作用域)。

这可以理解为,要找一个孩子,当然找到他父母是最方便的,如果其父母说这不是我的孩子。那么就去问他爷爷吧。

比喻不是很恰当,大家试着接受一下哈。

下图说明了在一个函数的作用域链中查找一个变量名的过程(这可是闭包函数的例子哦)

javascript 作用域链和变量解析

javascript 作用域链和变量解析

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/05/29/660/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

4 Responses to “javascript 变量作用域”

  1. #1 荒野无灯 回复 | 引用 Post:2009-05-31 13:58

    一个函数的定义是嵌套在另一个函数中,这是js的特色吧

    [回复]

  2. #2 simaopig 回复 | 引用 Post:2009-05-31 14:12

    @荒野无灯
    嗯。应该是吧,至少我在别的编程语言里没有见到过。呵呵。。

    貌似SHELL可以?记不清了。

    [回复]

  3. #3 挑战书 回复 | 引用 Post:2009-06-19 10:51

    好多字啊~~变量名解析&&查询,这样说得很到位,java就是一个解释执行的语言

    [回复]

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)