Luați în considerare un obiect simplu care conține proprietatea x și metoda f. care afișează valoarea acestui.x
După cum am indicat în postul anterior. când numiți object.f (), numărul 3 va fi afișat în consola. Să presupunem acum că trebuie să afișăm numărul dat în 1 secundă.
De fiecare dată când utilizați funcția de împachetare, este incomod. Aveți nevoie de o modalitate de a lega contextul unei funcții, astfel încât aceasta din interiorul funcției object.f se referă întotdeauna la obiect
1. jQuery.proxy
Dacă trebuie să specificăm același apel de mai multe ori, în loc să repetăm
este mai bine să luați rezultatul lucrației $ .proxy într-o variabilă separată
Să ne acordăm atenție faptului că am specificat de două ori obiectul din $ .proxy (prima dată când metoda obiectului este object.f, al doilea este contextul de transfer - obiect). Poate există o posibilitate de a evita suprapunerea? Răspunsul este da. Pentru astfel de cazuri, în $ .proxy, se adaugă o opțiune alternativă pentru trecerea parametrilor - primul parametru trebuie să fie un obiect, iar al doilea este numele metodei. exemplu:
Rețineți că numele metodei este trecut ca un șir.
2. Function.prototype.bind
Compatibilitate cu browserele
Firefox (Gecko): 4,0 (2)
Chrome: 7
Internet Explorer: 9
Opera: 11.60
Safari: 5.1.4
Funcția Emulation Function.prototype.bind din Rețeaua de dezvoltatori Mozilla
Function.prototype.bind are 2 scopuri - contextul static legat de funcția și aplicarea parțială a funcției.
De fapt, bind-ul creează o nouă funcție care numește func în context context. Dacă argumentele arg1, arg2 ... sunt specificate, ele vor fi adăugate la fiecare apel al noii funcții și vor apărea înaintea celor specificate atunci când este apelată noua funcție.
2.1. Context obligatoriu
Utilizați bind pentru a lega contextul este foarte simplu, uita-te doar la un exemplu:
Astfel, exemplul din introducere poate fi scris în următoarea formă:
2.2. Aplicarea parțială a funcțiilor
Pentru simplificare, să aruncăm o privire la un exemplu de utilizare a funcțiilor bind pentru a aplica parțial
După cum puteți vedea din exemplu - esența aplicării parțiale a funcțiilor este simplă - crearea unei noi funcții cu un număr redus de argumente, prin "fixarea" primelor argumente cu funcția de legare.
Acest lucru ar putea încheia articolul, dar ... Funcțiile obținute prin metoda de legare au câteva caracteristici speciale în comportament
2.3. Caracteristicile de legare
Înainte de a parcurge - Voi lista principalele caracteristici ale legăturii în conformitate cu standardul.
2.3.1. Proprietăți interne
Obiectele de funcții create de funcția Function.prototype.bind nu au proprietăți prototip sau proprietăți interne [[Code]], [[FormalParameters]] și [[Scope]].
Această constrângere distinge implementarea integrată a legăturii de la metode definite manual (de exemplu, o opțiune din MDN)
2.3.2. sunați și aplicați
Comportamentul apelului și aplicarea metodelor diferă de comportamentul standard pentru funcții, și anume:
Codul arată că această valoare nu este utilizată nicăieri. Astfel, pentru a înlocui contextul de apel pentru funcțiile primite folosind funcția Function.prototype.bind folosind call și apply - este imposibil!
2.3.3. În constructor
În acest constructor, acesta se referă la un obiect nou (creat). Cu alte cuvinte, contextul specificat cu bind este pur și simplu ignorat. Constructorul numește funcția [[Call]] obișnuită a funcției inițiale.
Important! Dacă constructorul nu returnează acest lucru. atunci valoarea returnată este nedefinită în cazul general!
Exemplu de parsare
concluzie
În acest post am încercat să descriu metodele de bază ale contextului legat de funcții și, de asemenea, am descris câteva caracteristici ale funcției Function.prototype.bind, în timp ce am încercat să las doar câteva detalii importante (din punctul meu de vedere).
Dacă observați erori / inexactități sau vreți să clarificați / adăugați - scrieți în LS, voi corecta