bind是否创建了该函数的新副本?

时间:2016-09-28 10:49:37

标签: javascript bind

所以,假设我们有这个功能:

scan 'testtable'

如果我这样做

function inc() {
   this.val++;
}

现在将var obj = {val: 5}; var incObj = inc.bind(obj); 函数复制到具有给定边界值的内存中,或者单个函数是否存储在内存中,只保存对绑定值的引用?该参考保存在哪里?

我问这个是因为我想知道是否可以创建内存泄漏来进行inc调用。 (实际上我关心垃圾收集,而不是关于内存泄漏)

1 个答案:

答案 0 :(得分:6)

  

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(意味着对它的引用)存储在引擎的内部绑定函数对象中。

  

我想知道是否可以创建内存泄漏来进行绑定调用。 (实际上我关心垃圾收集,而不是关于内存泄漏)

仅仅创建对象不是"内存泄漏&#34 ;;如果对象从不成为GC' d,那只是内存泄漏。简单地创建绑定函数永远不会导致内存泄漏,因为当绑定函数超出范围时,底层函数也将如此,因此它最终将成为GC。如果您实际上并不担心内存泄漏,而是创建对象,这将需要更多的GC并可能导致GC jag,这就是您创建的任何对象的情况,而不仅仅是绑定函数。