2012-11-22 10 views
6

Czy ktoś może wyjaśnić tę funkcję?Wyjaśnij funkcję bindbind()

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

Rozumiem wynik produkować:

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

Ale nie zrozumieć proces tworzenia tej funkcji, to znaczy część bind(Function.prototype.bind)

+0

"kontekst" będzie lepiej jako "thisValue" lub podobne. – RobG

+0

@RobG: Co jest nie tak z "* kontekstem"? Często go używam i uważam, że jest bardziej opisowy niż termin techniczny. Czy masz link do mnie (nas) do przeczytania? – Bergi

+0

W ECMAScript, "kontekst" jest używany w odniesieniu do [kontekst wykonania] (http://ecma-international.org/ecma-262/5.1/# sec-10), który zawiera wszystkie parametry i zakres aktualnie wykonywanego kodu. Zawiera wartość 'this' i jest kontrolowana przez sposób zapisywania kodu. Jest statyczny. Natomiast funkcja "this" jest dynamiczna i kompletnie określona przez funkcję, nie ma nic wspólnego z tym, jak funkcja jest zadeklarowana lub zainicjowana. Dlatego nazwanie tego "kontekstu" jest niewłaściwe. Ci, którzy to robią, muszą przeczytać i zrozumieć specyfikację języka, z którego korzystają. – RobG

Odpowiedz

4

OK. Mamy trzy razy Function.prototype.bind funkcji tutaj, którego (uproszczony) Kod

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

będę skracać w bardziej funkcjonalnym stylu z dużą ilością częściowego zastosowania: wiążą fn (kontekstu) -> fn kontekst.

Co więc robi? Masz bind.call(bind, bind) lub powiązać bind (bind). Rozwińmy to, aby związać bind. Co by było, gdybyśmy przekazali mu jakieś argumenty?

wiążą wiążą (wiązania) (FN) (kontekst)

wiążą wiążą(FN) (kontekst)

wiążą fn(kontekście)

FN kontekstowego

Tu jesteśmy. Możemy przypisać to do niektórych zmiennych, aby wynik wyraźniej:

bindbind = wiążą wiążą (powiązań)

bindfn = bindbind coś (fn) // wiążą fn

contextbindfn = bindfn coś (kontekstu) // fn kontekst

wynik = contextbindfn coś (arg) // fn kontekst (argumenty)

+0

czy mógłbyś wyjaśnić, dlaczego to rozwiązanie jest lepsze (lub prawdopodobnie powinienem zapytać, dlaczego istnieje), czy możemy po prostu zrobić 'fn.bind (context) (args)', aby osiągnąć ten sam rezultat? – asdf

+1

Zakładając, że masz api, które chce zwrócić 'bindfn' - nie zna jeszcze kontekstu. Następnie możesz użyć 'Function.prototype.bind.bind (fn)' - która jest długa - lub po prostu 'bindbind (fn)'. Nie wiem jednak, czy istnieje prawdziwa aplikacja. – Bergi

Powiązane problemy