作用域链 The Scope Chain

JavaScript is a lexically scoped language: the scope of a variable can be thought of as
the set of source code lines for which the variable is defined. Global variables are defined
throughout the program. Local variables are defined throughout the function in which
they are declared, and also within any functions nested within that function.

js是基于词法作用域的语言:变量的作用域可以理解为定义变量的一系列源代码。全局变量在整个程序中被定义。局部变量在声明它们的函数和该函数嵌套的所有函数中被定义。

If we think of local variables as properties of some kind of implementation-defined
object, then there is another way to think about variable scope. Every chunk of Java-
Script code (global code or functions) has a scope chain associated with it. This scope
chain is a list or chain of objects that defines the variables that are “in scope” for that
code. When JavaScript needs to look up the value of a variable x (a process called
variable resolution), it starts by looking at the first object in the chain. If that object has
a property named x, the value of that property is used. If the first object does not have
a property named x, JavaScript continues the search with the next object in the chain.
If the second object does not have a property named x, the search moves on to the next

object, and so on. If x is not a property of any of the objects in the scope chain, then

x is not in scope for that code, and a ReferenceError occurs.

如果把局部变量看做一种对象的属性,那么有另一种方法理解变量作用域。每一段js代码都有一个与它相关的作用域链。这个作用域链是一个对象的列表或者链,这组对象定义了在代码作用域中的变量。当js需要查找变量x的的值时,它从链中的第一个对象开始。如果这个对象有名为x的属性,就会用这个属性的值。如果x不是作用域链中所有对象的属性,x不在这段代码的作用域中。

In top-level JavaScript code (i.e., code not contained within any function definitions),
the scope chain consists of a single object, the global object. In a non-nested function,
the scope chain consists of two objects. The first is the object that defines the function’s
parameters and local variables, and the second is the global object. In a nested function,
the scope chain has three or more objects. It is important to understand how this chain
of objects is created. When a function is defined, it stores the scope chain then in effect.
When that function is invoked, it creates a new object to store its local variables, and
adds that new object to the stored scope chain to create a new, longer, chain that
represents the scope for that function invocation. This becomes more interesting for
nested functions because each time the outer function is called, the inner function is
defined again. Since the scope chain differs on each invocation of the outer function,
the inner function will be subtly different each time it is defined—the code of the inner
function will be identical on each invocation of the outer function, but the scope chain
associated with that code will be different.

在顶层js代码中,作用域链包含一个单一对象,即全局对象。在一个不嵌套的函数中,作用域链有两个对象。第一个对象定义了函数的参数和局部变量,第二个是全局变量。在一个嵌套函数中,作用域链有更多对象。当一个函数被定义时,它存储了作用域链。当函数被触发时,它创建了一个新的对象来存储它的局部变量,然后将这个新的对象添加到存储的作用域链上,来生成一个更长的新的作用域链。这个作用域链表示作用域。对嵌套函数来说,每当外部函数被调用,内部函数被重新定义。由于作用域链在每次外部函数调用时都不同,内部函数在每次定义时略有不同。内部函数的代码相同,但是作用域链不同。

时间: 2024-10-11 03:46:55

作用域链 The Scope Chain的相关文章

JavaScript作用域链

JavaScript作用域链 之前写过一篇JavaScript 闭包究竟是什么的文章理解闭包,觉得写得很清晰,可以简单理解闭包产生原因,但看评论都在说了解了作用域链和活动对象才能真正理解闭包,起初不以为然,后来在跟公司同事交流的时候发现作用域和执行环境确实很重要,又很基础,对理解JavaScript闭包很有帮助,所以在写一篇对作用域和执行环境的理解. 作用域 作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域有全局作用域和局部作用域. 单纯

作用域链

JavaScript 开发进阶:理解 JavaScript 作用域和作用域链 作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript. JavaScript作用域 任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.在JavaScript中,变

JavaScript---闭包和作用域链

作用域和作用域链: 参考文章 :http://www.cnblogs.com/malinlin/p/6028842.html  http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html  http://www.zhangyunling.com/?p=134 总结:  ① js中处处是对象 ②函数执行时会创建一个执行环境和变量对象 ③代码在执行环境中运行 变量对象会按照顺序存到作用域链中 ④执行一次函数就

JavaScript 开发进阶:理解 JavaScript 作用域和作用域链

作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript. JavaScript作用域 任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.在JavaScript中,变量的作用域有全局作用域和局部作用域两种. 1.  全局作用域(Global S

JavaScript作用域和作用域链

JavaScript 开发进阶:理解 JavaScript 作用域和作用域链 来源:梦想天空  http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html 作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript. Java

关于Javascript作用域及作用域链的总结

本文是根据以下文章以及<Javascript高级程序设计(第三版)>第四章相关内容总结的. 1.Javascript作用域原理,地址:http://www.laruence.com/2009/05/28/863.html 2.JavaScript 开发进阶:理解 JavaScript 作用域和作用域链,地址:http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html 在介绍有关作用域的内容之前,先来介绍

理解javascript作用域和作用域链

作用域 作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域有全局作用域和局部作用域. 全局和局部作用域下面用一张图来解释: 单纯的JavaScript作用域还是很好理解的. 作用域链 全局执行环境是最外层的一个执行环境,在web浏览器中全局执行环境是window对象,因此所有全局变量和函数都是作为window对象的属性和放大创建的.每个函数都有自己的执行环境,当执行流进入一个函数的时候,函数的环境会被推入一个函数栈中,而在函数执行完毕后执行

深入理解javascript作用域链

之前作用域链在我眼里也只是在调用一个对象时一层一层向上找到自己所需的变量或是函数,若没有则返回undefined,其实大致上说却是这样的,但是我需要的是不断的深入. 在深入理解之前先记住两句话 1.js中一切皆对象,函数也是对象 2.函数运行在他们被定义的作用域内,而不是被执行的作用域内. 当定义函数时,会包含[[scope]]属性(因为js中一切皆对象,函数也是对象),此属性是函数内部属性,只允许js引擎访问,[[scope]]指向作用域链(scope lain),而此时仅包含 所有全局变量.

浅析作用域链–JS基础核心之一

JS中的作用域,大家都知道的,分为全局作用域和局部作用域,没有块级作用域,听起来其实很简单的,可是作用域是否能够有深入的了解,对于JS代码逻辑的编写成功率,BUG的解决能力,以及是否能写出更优秀的代码,都有很重要的影响的,如果想要写出更优雅更高效的逻辑代码,那么就要深入的了解一下作用域的问题了,确切的说,是要更深入的了解一下,怎么更有效更巧妙的利用作用域. 全局和局部作用域 这个我觉得吧,只要学习过编程语言的,就会对这些有简单的了解的.比如在JS语言中,属于window对象的属性和方法,是可以被