编程语言
首页 > 编程语言> > 高性能JavaScript(二)数据存取之闭包与作用域

高性能JavaScript(二)数据存取之闭包与作用域

作者:互联网

闭包、作用域与内存

如果在阅读下面文章中,
  对作用域、作用域链、活动对象以及执行速度产生的影响有疑问的可阅读:高性能JavaScript(二)数据存取之作用域链

闭包是JavaScript最强大的特性之一,它允许访问局部作用域之外的数据。然而,使用闭包可能导致性能问题。

闭包与内存

function sum() {
    var num = 0;

    function print() {
        num += 2;
        console.log(num);
        return num;
    }
    return print;
}
var fn = sum();
fn(); //2
fn(); //4

  sum()函数包含了一个内部函数print(),这个print()函数就是一个闭包。print()在sum()执行时创建,并且能访问词法作用域的id变量。之所以能访问到id,是因为创建了一个特定的作用域链。
  sum()执行时,它的执行环境中的作用域链中对象会在闭包被创建时,闭包的[[ scope]]属性被初始化为这些对象。
  通常来说,函数的活动对象会随着执行环境一同销毁,但引入闭包时,由于引用仍然存在于闭包的[[ scope]]属性中,因此不会被删除。这也就意味着脚本中的闭包与非闭包函数相比需要更大的内存开销。

闭包与执行速度

  闭包代码执行时,会创建一个执行环境,它之中的作用域链与属性[[ scope]]中所引用的两个相同的作用域链对象一起被初始化,然后一个活动对象为闭包自身所创建。
  此时,闭包的执行环境中的作用域链包含三个对象,活动对象(闭包)–>活动对象(sum)–>全局对象。这其中就包含了关乎性能的点:在频繁的访问跨作用域的标识符时,每次访问都会带来性能损失。如何减轻闭包对执行效率的影响:将常用的跨作用域的变量储存到局部变量中,然后直接访问局部变量。

总结

在脚本编程中,最好小心的使用闭包,它同时关乎内存和执行速度。

标签:闭包,作用域,sum,JavaScript,之闭,对象,print,执行
来源: https://blog.csdn.net/csc_cary/article/details/113717947