课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
JavaScript编程开发是我们在学习web前端课程的时候需要重点掌握的一项编程知识,而今天我们就通过案例分析来了解一下,作用域链在JavaScript编程环境的应用。
作用域链(ScopeChain)
当JavaScript在运行的时候,它需要一些空间让它来存储本地变量(localvariables)。我们将这些空间称为作用域对象(Scopeobject),有时候也称作LexicalEnvironment。例如,当你调用函数时,函数定义了一些本地变量,这些变量就被存储在一个作用域对象中。你可以将作用域函数想象成一个普通的JavaScript对象,但是有一个很大的区别就是你不能够直接在JavaScript当中直接获取这个对象。你只可以修改这个对象的属性,但是你不能够获取这个对象的引用。
作用域对象的概念使得JavaScript和C、C++非常不同。在C、C++中,本地变量被保存在栈(stack)中。在JavaScript中,作用域对象是在堆中被创建的(至少表现出来的行为是这样的),所以在函数返回后它们也还是能够被访问到而不被销毁。
正如你做想的,作用域对象是可以有父作用域对象(parentscopeobject)的。当代码试图访问一个变量的时候,解释器将在当前的作用域对象中查找这个属性。如果这个属性不存在,那么解释器就会在父作用域对象中查找这个属性。就这样,一直向父作用域对象查找,直到找到该属性或者再也没有父作用域对象。我们将这个查找变量的过程中所经过的作用域对象乘坐作用域链(Scopechain)。
在作用域链中查找变量的过程和原型继承(prototypalinheritance)有着非常相似之处。但是,非常不一样的地方在于,当你在原型链(prototypechain)中找不到一个属性的时候,并不会引发一个错误,而是会得到undefined。但是如果你试图访问一个作用域链中不存在的属性的话,你就会得到一个ReferenceError。
在作用域链的顶层的元素就是全局对象(GlobalObject)了。运行在全局环境的JavaScript代码中,作用域链始终只含有一个元素,那就是全局对象。所以,当你在全局环境中定义变量的时候,它们就会被定义到全局对象中。当函数被调用的时候,作用域链就会包含多个作用域对象。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!