2012-11-22 84 views
6

有人可以解釋這個函數嗎?說明bindbind()函數

var bindbind = Function.prototype.bind.bind(Function.prototype.bind); 

我的理解產生的結果是:

var bindedContextFunc = bindbind(function)(context); 
bindedContextFunc(args); 

但不明白創建此功能的過程中,我的意思是部分bind(Function.prototype.bind)

+0

「上下文」 將是爲 「thisValue」 或類似的更好。 – RobG

+0

@RobG:「* context *」有什麼問題?我發現它經常使用,我認爲它比技術術語更具描述性。你有鏈接供我(我們)閱讀嗎? – Bergi

+0

在ECMAScript中,「上下文」用於[執行上下文](http://ecma-international.org/ecma-262/5。1 /#sec-10),其中包括當前正在執行的代碼的所有參數和範圍。它包含一個'this'值,並由代碼的寫入方式來控制。它是靜態的。相比之下,函數的this值是動態的,並且完全由函數的調用方式來設置,它與函數的聲明或初始化無關。所以調用「this」上下文是不合適的。那些這樣做的人需要閱讀和理解他們正在使用的語言的規範。 – RobG

回答

4

確定。我們有三次Function.prototype.bind這裏的功能,它的(簡化)代碼

function bind(context) { 
    var fn = this; 
    return function() { 
     return fn.apply(context, arguments); 
    } 
} 

我會來縮短與許多部分應用程序的功能更強大的風格:綁定 FN(上下文) - > FN 背景

那麼它是做什麼的?您已獲得bind.call(bind, bind)或綁定綁定(綁定)。讓我們展開這個綁定綁定。如果我們現在提供一些參數呢?

綁定綁定(綁定)(FN)(上下文)

綁定綁定(FN)(上下文)

綁定FN(上下文)

FN 方面

我們在這裏。我們可以將這個給一些變量來使結果更加清晰:

bindbind =綁定綁定(綁定)

bindfn = bindbind 什麼(FN)//綁定 FN

contextbindfn = bindfn 任何東西(上下文)// fn 上下文

結果= contextbindfn 任何(參數)// FN 上下文(參數)

+0

你能否詳細說明爲什麼這個解決方案更好(或者我應該問爲什麼它存在),如果我們可以只做'fn.bind(context)(args)'來實現相同的結果? – asdf

+1

假設你有一個想要返回'bindfn'的api - 它還不知道上下文。然後你可以使用'Function.prototype.bind.bind(fn)' - 這很冗長 - 或者只是'bindbind(fn)'。但是,不確定是否有真實世界的應用程序。 – Bergi