javascript之bind 会创建函数的新副本吗

mfrbuaa 阅读:195 2025-06-02 22:19:02 评论:0

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

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

如果我这样做
var obj = {val: 5}; 
var incObj = inc.bind(obj); 

现在将 inc使用给定的绑定(bind)值将函数复制到内存中,还是将单个函数存储在内存中并且只保存对绑定(bind)值的引用?该引用保存在哪里?

我问这个是因为我想知道是否会造成内存泄漏 bind来电。 (实际上我关心的是垃圾回收,而不是内存泄漏)

请您参考如下方法:

Does bind create a new copy of the [underlying] function?



不,它没有。

它创建了一个新函数,在调用该函数时会调用底层函数。

出于所有实际目的, bind是:
function bind(fn, thisArg) { 
  return function() { 
    return fn.apply(thisArg, arguments); 
  }; 
} 

如您所见,形状或形式绝不是 fn被复制。

如果是:
var incObj = inc.bind(obj); 

Will now the inc function be copied in the memory with the given bound value or a single function is stored in the memory and only a reference to the bound value is saved? Where is that reference saved?



后者,然而更准确的说法是“单个 新的 函数存储在内存中, 在其中 只是对 函数的引用,bind 是称为 ”。

换句话说, inc保持原样。一个新的绑定(bind)函数对象 incObj被创建,内部指向 inc .在上面的例子中, inc由于被内部匿名函数封闭而被“存储”。实际上, inc ,意思是对它的引用,存储在引擎的内部绑定(bind)函数对象中。

I want to know if a memory leak could be created making bind calls. (actually I care about garbage collection, not about memory leaks)



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


标签:JavaScript
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号