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

闭包与执行速度

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

总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值