Vue源码中关于拦截数组方法的困惑?

作者站长头像
站长
· 阅读数 20
// Vue 2.0 src/core/observer/array.js

;[
    'push',
    'pop',
    'shift',
    'unshift',
    'splice',
    'sort',
    'reverse'
]
    .forEach(function (method) {
        // cache original method
        const original = arrayProto[method]
        def(arrayMethods, method, function mutator() {
            // avoid leaking arguments:
            // http://jsperf.com/closure-with-arguments(失效)
            let i = arguments.length
            const args = new Array(i)
            while (i--) {
                args[i] = arguments[i]
            }
            const result = original.apply(this, args)

注释中说避免泄露参数。不明白如果不按源码中那么写,是如何有泄露参数的风险?

回复
1个回答
avatar
test
2024-06-30

这里的内存泄露是说,防止新建没必要的arguments对象,来优化性能,旧的JS引擎里arguments对象和函数参数之间有链接。如果你改了arguments对象里的值,对应的函数参数也会变,但是现在的JS引擎对arguments对象已经做过优化了,直接用arguments对象不会影响性能,vue是为了保证所有环境的性能,所以不直接用arguments对象。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容