ECMAScript 老生常谈(总结) 三、对象篇

164 阅读3分钟

闭包

先来一句话解释闭包,仅仅这是我对W3C中对闭包表述的理解。

闭包: 被 “外部引用” 的 “使用了不属于自己代码块的变量” 的 函数。

上图中的两个函数add5和add10内部拥有不同的作用域,所以他们每个都是不同的闭包

垃圾回收机制:

如果一个对象不再被引用, 那么这个对象就会被垃圾回收机制回收;

如果两个对象互相引用, 且不再被第3者所引用, 那么这两个互相引用的对象也会被回收。

(在闭包中,父函数被子函数引用,子函数又被外部的一个变量引用,这就是父函数不被回收的原因)

闭包原理

内部函数用了外部函数或者全局中的变量,并将其保存在自己的作用域中,外部一旦引用了这个内部函数,这个被引用的内部函数就独立出来形成闭包无法被销毁。下图中

图中bar()在外部函数中被执行,第六行 bar()。执行完毕自动销毁,引用也就销毁了,每一次引用都是重新执行并且执行完就销毁!这种情况就是没有形成闭包

那么怎么才能形成闭包? 如下图,将内部函数返回:

直接执行:

外部引用:

为什么明明在外部直接执行为什么每次都是一样的呢?

直接执行依旧是形成了闭包,但是每次都产生一个新的闭包,因为并没有声明变量接收他,每次执行foo()()产生的闭包都漂浮在神秘空间中无法被回收

关于闭包,这里有更详细的解释: www.jb51.net/article/857…

对象

ECMAScript是弱类型语言,使用晚绑定,即解释程序运行前并不知道对象的类型,只需检查对象是否支持属性和方法,这样就允许执行大量的对象操作,而无任何惩罚。

废除对象

把对象的所有引用都设置为 null,可以强制性地废除对象。 例如:

对象类型

本地对象

前面几个对象类型我相信大家都认识,说明一下后面几个是什么。

EvalError,

RangeError,

ReferenceError,

SyntaxError

TypeError

URIError

内置对象

ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。

宿主对象

***所有 BOM 和 DOM 对象***都是宿主对象

对象作用域

ECMAScript 只有公用作用域

建议性的解决方法

由于缺少私有作用域,开发者确定了一个规约,说明哪些属性和方法应该被看做私有的。这种规约规定在 属性前后加下划线

划线并不改变属性是公用属性的事实,它只是告诉其他开发者,应该把该属性看作私有的。

关键字 this

关键字 this, 总是指向调用该方法的对象

对象创建方法

这里不展开了,篇幅比较长,给大家两个链接: www.w3cschool.cn/ecmascript/… 这是w3c的。

alvinyuxt.github.io/2016/11/11/… 这个是掘金上点在比较多的,两者都差不太多。