一、闭包
闭包:
闭包指有权访问另一个函数作用域中变量的函数,创建闭包最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包就可以突破作用域。(就是能够读取其他函数内部变量的函数)
闭包的特性:
函数内再嵌套函数;
内部函数可以引用外层的参数和变量;
参数和变量不会被垃圾回收机制回收。
使用闭包主要是为了设计私有的方法和变量。闭包的优点:可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄漏。在JS中,函数即闭包,只有函数才会产生作用于的概念。
闭包用处(3个):第一个,可以读取函数内部的变量;第二个,就是让这些变量始终保持在内存中;第三个,封装对象的私有属性和私有方法。
好处:能够实现封装和缓存等;
坏处:消耗内存,不正当使用会造成内存溢出的问题。
使用闭包注意点:
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
(垃圾回收机制:找出那些不再继续使用的变量,然后释放其占用的内存,垃圾收集器按照固定的时间间隔周期性进行这一操作)
二、作用域链的理解
作用域链的作用:保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变量是不被允许的。简单说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
三、JavaScript原型,原型链的理解
每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去prototype里找这个属性,这个prototype又会有自己的prototype,于是就这样一直找下去,也就是我们平时所说的原型链的概念。
关系:instance.constructor.prototype=instance.__prototype__
特点:JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。当我们需要一个属性时,JavaScript引擎会先看当前对象中是否有这个属性,如果没有的就会查找他的prototype对象是否有这个属性,如此递推下去,一直检索到Object内建对象。
原文:https://www.cnblogs.com/p0123/p/12001690.html