犀牛书学习笔记(6):理解做用域和做用域链

任何语言都有做用域,javascript的做用域很是的特殊,实现的是一个做用域链,要理解其对象和函数,不可避免须要先理解其做用域和做用域链。在函数章节,简单的描述了做用域链的概念,本篇尝试对其进行透彻的分析研究。javascript

变量做用域java

在第一篇讲述变量的时候,说到变量具备全局做用域和局部做用域。和其余语言相比,js没有块做用域,所以函数中变量的局部做用域在整个函数内部都是可访问的,而无论是在哪一个代码块中。当变量申明时没有添加var关键字,就自动成为全局做用域变量,而无论它的位置。函数

对象做用域spa

在传统的面向对象程序设计中,主要关注于公用和私有做用域。公用做用域中的对象属性能够从对象外部访问,即开发者建立对象的实例后,就可以使用它的公用属性。而私有做用域中的属性只能在对象内部访问,即对于外部世界来讲,这些属性并不存在。这意味着若是类定义了私有属性和方法,则它的子类也不能访问这些属性和方法。设计

受保护做用域也是用于定义私有的属性和方法,只是这些属性和方法还能被其子类访问。对象

对 ECMAScript 讨论上面这些做用域几乎毫无心义,由于 ECMAScript 中只存在一种做用域 - 公用做用域。ECMAScript 中的全部对象的全部属性和方法都是公用的。所以,定义本身的类和对象时,必须格外当心。记住,全部属性和方法默认都是公用的!ip

建议性的解决方法

许多开发者都在网上提出了有效的属性做用域模式,解决了 ECMAScript 的这种问题。作用域

因为缺乏私有做用域,开发者肯定了一个规约,说明哪些属性和方法应该被看作私有的。这种规约规定在属性先后加下划线:开发

obj._color_ = "blue";

这段代码中,属性 color 是私有的。注意,下划线并不改变属性是公用属性的事实,它只是告诉其余开发者,应该把该属性看做私有的。程序设计

有些开发者还喜欢用单下划线说明私有成员,例如:obj._color。

做用域链

函数对象和其它对象同样,拥有能够经过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部属性包含了函数被建立的做用域中对象的集合,这个集合被称为函数的做用域链,它决定了哪些数据能被函数访问。

当一个函数建立后,它的做用域链会被建立此函数的做用域中可访问的数据对象填充。若是不是嵌套函数,会被填入一个全局对象,包含有全部全局变量。函数执行时,会建立一个运行时上下文对象,初始化为当前函数的做用域链所包含的对象,组成一个活动对象,添加到做用域链之中,这是一个压栈操做,最近的老是在做用域链头部。函数执行过程当中,每次须要解析变量,都会到做用域链中从头至尾顺序查找,直到找到,不然是未定义。

从做用域链原来能够知道,javascript顶层代码是全局做用域,经过全局对象访问。对象(包括函数)建立、执行时初始化一个活动对象在做用域链头部,嵌套函数的添加,会将外部函数压向更深位置。

铜鼓偶做用域链的原理,可访问性是这样的,javascript顶层代码只能看到全局对象范围的变量,对象能够看到本身和全局变量,嵌套函数能看到本身、外部函数和全局变量,反之则不可见。

相关文章
相关标签/搜索