深入理解javascript变量作用域

犀牛书上说:
javascript的解释器每次开始执行一个函数时,都会为那个函数创建一个执行环境(execute context).一个执行环境就是所以javascript代码段执行时所在的环境.这个环境的一个重要部分是定义变量的对象.运行不属于任何函数的javascript代码的环境使用的就是全局对象.所以javascript函数都运行在自己独有的执行环境中,而且具体自己的调用对象,在调用对象中定义了局部变量.
全局变量具有全局的作用域,而函数中声明的变量具有局部的作用域.如果一个函数定义嵌套在另一个函数中,那么在嵌套的函数中声明的变量就具有嵌套的局部作用域.
每个javascript执行环境都有一个和他关联在一起的作用域链(scope chain).这个作用域链是一个对象列表或对象链.当javascript代码需要查询变量x的值时(一个称为变量名解析(variable name resolution)的过程,他就开始查看该链的第一个对象.如果那个对象有一个名为x的属性,那么就采用那个属性的值.如果第一个对象没有名为x的属性,javascript就会继续查询链中的第二个对象.如果第二个对象仍然没有名为x的属性,那么就继续查询下一个对象,以此类推.


在javascript的顶层代码中(例如,不属于任何函数定义的代码),作用域链只由一个对象构成,那么就是全局对象.所以的变量都是在这一对象中查询的.如果一个变量并不存在,那么这个变量的值就是未定义的.在一个(非嵌套的)函数中,作用域链是由两个对象构成的,第一个是函数的调用对象,第二个就是全局对象.当函数引用一个变量时,首先检查的是调用对象(局部作用域),其次才是检查全局对象(全局作用域).在一个嵌套的函数作用域链中可以有三个或更多的对象.下面的例子说明了在一个函数的作用域链中查找一个变量名的过程.

提示:您可以先修改部分代码再运行

发表评论

返回顶部