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

Cri*_*sty 2 javascript bind

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

function inc() {
   this.val++;
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做

var obj = {val: 5};
var incObj = inc.bind(obj);
Run Code Online (Sandbox Code Playgroud)

现在将inc函数复制到具有给定边界值的内存中,或者单个函数是否存储在内存中,只保存对绑定值的引用?该参考保存在哪里?

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

小智 7

是否bind创建[底层]函数的新副本?

不,它没有.

它创建一个新函数,在调用时,调用底层函数.

出于所有实际目的,bind是:

function bind(fn, thisArg) {
  return function() {
    return fn.apply(thisArg, arguments);
  };
}
Run Code Online (Sandbox Code Playgroud)

如您所见,绝不fn会复制形状或形式.

如果是:

var incObj = inc.bind(obj);
Run Code Online (Sandbox Code Playgroud)

现在将inc函数复制到具有给定边界值的内存中,或者单个函数是否存储在内存中,只保存对绑定值的引用?该参考保存在哪里?

后者,但是更准确地说"单个函数存储在内存中,并且在其中只是bind被称为函数的函数的引用".

换句话说,inc保持原样.incObj创建一个新的绑定函数对象,该对象在内部指向inc.在上面的示例中,inc由于被内部匿名函数关闭而"存储".实际上,inc意味着对它的引用,存储在引擎的内部绑定函数对象中.

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

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