因此,假设我们具有以下功能:
function inc() {
this.val++;
}
如果我这样做
var obj = {val: 5};
var incObj = inc.bind(obj);
现在将inc
函数以给定的绑定值复制到内存中,还是将单个函数存储在内存中,而仅保存对绑定值的引用?该参考保存在哪里?
我问这个问题是因为我想知道是否会在bind
调用时造成内存泄漏。(实际上,我关心的是垃圾回收,而不是内存泄漏)
是否
bind
创建[底层]函数的新副本?
不,不是。
它创建一个新函数,该新函数在调用时将调用基础函数。
出于所有实际目的,bind
是:
function bind(fn, thisArg) {
return function() {
return fn.apply(thisArg, arguments);
};
}
如您所见,绝不fn
会复制形状或表格。
如果是:
var incObj = inc.bind(obj);
现在将
inc
函数以给定的绑定值复制到内存中,还是将单个函数存储在内存中,而仅保存对绑定值的引用?该参考保存在哪里?
后者,但是说“单个新功能存储在内存中,并且其中仅包含对bind
被调用的功能的引用”会更准确。
换句话说,inc
保持原样。incObj
创建一个新的绑定函数对象,该对象内部指向inc
。在上面的示例中,inc
由于被内部匿名函数关闭而被“存储”。实际上,inc
意味着对它的引用存储在引擎的内部绑定函数对象中。
我想知道是否可以通过绑定调用创建内存泄漏。(实际上,我关心的是垃圾回收,而不是内存泄漏)
仅仅创建对象并不是“内存泄漏”;如果该对象永远不会被GC处理,那只会是内存泄漏。简单地创建绑定函数将永远不会导致内存泄漏,因为当绑定函数超出范围时,基础函数也会超出范围,因此最终将被GC处理。如果您实际上不是在担心内存泄漏,而是在担心创建对象,这将需要更多的GC并可能导致GC崩溃,那么对于您创建的任何对象都是这种情况,而不仅仅是绑定函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句