Powód korzystania z
(0, foo.fn)();
jest wycięcie powiązania : this
nie będzie już związane, foo
ale będzie powiązane z obiektem globalnym.
Ale jaki jest powód, dla którego dowolny kod JavaScript (lub kod JS Google) chce wyciąć powiązanie? (i czy jest to anty-wzór, czy nie?)
javascript
niepolarność
źródło
źródło
bind
metoda wiąże. To tylko zmiana kontekstu. Nie możesz wyciąć ani stracić wiązania (więź utworzona przezbind
).Odpowiedzi:
Ten rodzaj kodu jest zwykle generowany przez transpilatory (takie jak Babel), w celu konwersji nowoczesnego JavaScript - który korzysta z najnowszych dodatków do specyfikacji - na wersję JavaScript, która jest szerzej obsługiwana.
Oto przykład, w którym występuje ten wzór transpilacji:
Powiedzmy, że mamy ten oryginalny kod przed transpilacją:
Aby kod ten był zgodny z ES5, możesz to zrobić:
Ale tutaj wykonalibyśmy
myfunc
zmymodule
asthis
wartości, która nie dzieje się w oryginalnym kodzie. I mimo, że może nie zawsze być problem, to lepiej, aby upewnić się, że zachowuje się funkcja podobnie jak miałoby to w oryginalnej wersji , nawet jeśli ta funkcja będzie używaćthis
Reference - jak nietypowe lub nawet bezużyteczne, że stosowaniethis
wmyfunc
może być ( ponieważ również w oryginalnej wersji byłobyundefined
).Na przykład, jeśli oryginalny kod
this.memberFun()
zgłasza błąd z powodu odwołania w funkcji, to również wrzuci transpilowaną wersję.Tak więc operator przecinka służy do pozbycia się tej różnicy:
To prawda, że w kodzie, który sam piszesz, nigdy nie miałbyś dobrego przypadku użycia dla tego wzorca, ponieważ nie byłby używany
this
wmyfunc
pierwszej kolejności.źródło
require
związany z ES6 lub ES5? Kiedyś myślałem, że tym wymaganiem jest moduł węzła.require
jest rzeczywiście funkcją dostępną w węźle lub dostępną w bibliotekach takich jak browserify, wymagają.js itp. Nie jest to szczególnie związane z ES5 / 6. Z drugiej strony konstrukcja języka ES6 +, taka jak,import
nie może zostać przeniesiona do ES5 bez czegoś takiego jak transpilacja.modA.fn1
), to te funkcje naprawdę nie powinny używać,this
ale jeśli przypadkiem tak, nie chcemy,this
aby wpływał on na moduł w jakikolwiek sposób jako efekt uboczny, więc przerywamy wiązanie, aby zachowywał się tak, jak powinien, jeśli jest niezależną funkcją