JavaScript核心概念归纳整理( 二 )


以下是几种获取原型对象的方法:
作用域、作用域链
说到作用域 , 就必须结合变量的访问权限来说明 。一个变量的作用域就是在程序中定义变量的区域 , 它规定了执行程序如何对变量进行查找 , 也就是确定当前的执行代码对变量的访问权限 。在ES5中有全局作用域、函数作用域、eval作用域 , 在ES6中新增了块级作用域 。
作用域链 , 则需要结合函数的嵌套来说明 。当定义一个函数时 , 它实际上创建了一个作用域节点 , 该节点上存储着当前作用域中的局部变量 , 并且该节点会挂载在作用域链的底端 。在该函数中嵌套定义另一个函数时 , 同样会创建另一个函数作用域的节点 , 该节点同样也存储着当前函数作用域中的局部变量 , 在作用域链中会将该节点挂载在外层函数的节点之下 。所以在进行变量访问时 , 会从自身节点开始查找 , 如果未找到变量的对应值 , 则会继续查找上一个节点 。而由这一系列节点所串联起来的链就是我们所说的作用域链 。
JavaScript中的函数采用静态作用域 , 也称词法作用域 。当在执行函数调用时 , 不管何时何地执行函数 , 其中的变量在函数定义时就已经决定了 , 函数会从自身作用域节点开始 , 沿着作用域链向上访问变量的值 。
注意:作用域链的顶端是全局作用域 , 作用域链在函数定义时就已经创建了 。
闭包、垃圾回收机制闭包 , 又一个老生常谈的话题 , 可以用一句话对之概括:有权访问另一个函数作用域内变量的函数都是闭包 。例如:
这里返回的inner函数就是能够访问outer函数中变量的闭包 , 除inner函数之外的外部作用域都无法访问outer函数中的变量a 。
闭包特性:
1.函数返回嵌套的函数形成闭包
2.闭包内部可以访问外部的参数和变量
3.外部参数和变量在被闭包引用时不会被垃圾回收机制回收
【JavaScript核心概念归纳整理】闭包优点:
1.可避免变量对全局的污染
2.允许函数私有成员的存在
3.允许变量长驻内存
闭包缺点:
由于变量常驻内存 , 增大内存使用量 , 使用不当很容易造成内存泄漏 。
闭包应用场景:
1.采用函数引用方式的setTimeout调用
2.将函数关联到对象的实例方法
3.封装相关的功能集
JS垃圾回收机制原理
JavaScript中的垃圾回收 , 主要是一种针对程序执行环境中内存的管理机制 , 该机制最大限度的优化了JS程序对操作系统内存的使用 。垃圾回收机制也同样非常容易理解:就是利用垃圾收集器 , 周期性的回收那些程序中 , 不被其他引用所指向的变量的内存资源 。不被其他引用所指向的变量就是程序中不会再用到的变量 , 也就是生命周期结束的变量 , 这种变量多为局部变量 , 而全局变量只有在关闭浏览器或终止当前运行环境的情况下其生命周期才会结束 。所以此时垃圾收集器所要做的就是周期性的检索程序中处于结束状态的变量 , 同时回收他们所占用的内存资源 。
而闭包的使用则无疑会增加程序对内存资源的占用 , 因为在闭包中存储着对外部变量的引用 , 所以只要闭包中存储的外部引用未停止使用 , 那么外部变量就永远存在 , 且其所占用的内存资源无法被垃圾回收机制所释放 。因此合理的使用闭包 , 能优化程序的执行效率及降低程序的资源占有率 。
this指向this的指向问题无疑是JavaScript语言中必须掌握的核心概念 。上文提到 , 在执行上下文创建的阶段 , 就会建立this指向 。而更细致的说 , this的指向 , 是在函数被调用的时候确定的 。
下面是this指向的四种场景:
1.如果一个函数中有this , 但是它没有以对象方法的形式调用 , 而是以函数名的形式执行 , 那么this指向的就是全局对象 。
2.如果一个函数中有this , 并且这个函数是以对象方法的形式调用 , 那么this指向的就是调用该方法的对象 。
3.如果一个函数中有this , 并且包含该函数的对象也同时被另一个对象所包含 , 尽管这个函数是被最外层的对象所调用 , this指向的也只是它上一级的对象 。


推荐阅读