所以,假设我们有这个功能:
scan 'testtable'
如果我这样做
function inc() {
this.val++;
}
现在将var obj = {val: 5};
var incObj = inc.bind(obj);
函数复制到具有给定边界值的内存中,或者单个函数是否存储在内存中,只保存对绑定值的引用?该参考保存在哪里?
我问这个是因为我想知道是否可以创建内存泄漏来进行inc
调用。 (实际上我关心垃圾收集,而不是关于内存泄漏)
答案 0 :(得分:6)
bind
是否会创建[基础]函数的新副本?
不,它没有。
它创建一个新函数,在调用时,调用底层函数。
出于所有实际目的,bind
是:
function bind(fn, thisArg) {
return function() {
return fn.apply(thisArg, arguments);
};
}
正如您所看到的,形状或形式绝不会被fn
复制。
以下情况:
var incObj = inc.bind(obj);
现在将
inc
函数复制到具有给定边界值的内存中,或者单个函数是否存储在内存中,只保存对绑定值的引用?该参考保存在哪里?
后者,但是更准确地说"单个新功能存储在内存中,在其中仅提及 bind
被称为1>}的功能"。
换句话说,inc
仍然完全如此。创建一个新的绑定函数对象incObj
,其内部指向inc
。在上面的示例中,inc
是"存储"由于被内部匿名函数关闭。实际上,inc
(意味着对它的引用)存储在引擎的内部绑定函数对象中。
我想知道是否可以创建内存泄漏来进行绑定调用。 (实际上我关心垃圾收集,而不是关于内存泄漏)
仅仅创建对象不是"内存泄漏&#34 ;;如果对象从不成为GC' d,那只是内存泄漏。简单地创建绑定函数永远不会导致内存泄漏,因为当绑定函数超出范围时,底层函数也将如此,因此它最终将成为GC。如果您实际上并不担心内存泄漏,而是创建对象,这将需要更多的GC并可能导致GC jag,这就是您创建的任何对象的情况,而不仅仅是绑定函数。