Legarea contextului (aceasta) la o funcție în javascript și aplicarea parțială a funcțiilor

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







Trimiteți-le prietenilor: