Jak przekazać kontekst setTimeout
? Chcę zadzwonić, this.tip.destroy()
jeśli this.options.destroyOnHide
po 1000 ms. Jak mogę to zrobić?
if (this.options.destroyOnHide) {
setTimeout(function() { this.tip.destroy() }, 1000);
}
Kiedy próbuję powyższego, this
odnosi się do okna.
javascript
callback
this
settimeout
JamesBrownIsDead
źródło
źródło
Odpowiedzi:
EDYCJA: Podsumowując, w 2010 r., Kiedy zadano to pytanie, najczęstszym sposobem rozwiązania tego problemu było zapisanie odwołania do kontekstu, w którym wywołano
setTimeout
funkcję, ponieważsetTimeout
wykonuje funkcjęthis
wskazując na obiekt globalny:W specyfikacji ES5, wydanej przed rokiem, wprowadzono
bind
metodę , która nie została zasugerowana w pierwotnej odpowiedzi, ponieważ nie była jeszcze szeroko obsługiwana i potrzebne były do niej wielopełniacze, ale teraz jest ona wszędzie:bind
Funkcja tworzy nową funkcję othis
wartości wstępnie wypełnione.Teraz we współczesnym JS jest to problem, który rozwiązują funkcje strzałek w ES6 :
Funkcje strzałek nie mają własnej
this
wartości, gdy uzyskujesz do niej dostęp, uzyskujesz dostęp dothis
wartości obejmującego zakresu leksykalnego.HTML5 również znormalizował liczniki czasu w 2011 roku, a teraz możesz przekazać argumenty do funkcji wywołania zwrotnego:
Zobacz też:
źródło
this
do funkcji, rozwiązałeś ten problem dla tego przypadku, dla map (), forEach () itp., itp., używając mniej kodu, mniej cykli procesora i mniej pamięci. *** Patrz: odpowiedź Miszy Reyzlin.Istnieją gotowe skróty (cukier składniowy) do opakowania funkcji @CMS, na które odpowiedziano. (Poniżej, zakładając, że kontekst, który chcesz, to
this.tip
.)ECMAScript 5 ( bieżące przeglądarki , Node.js) i Prototype.js
Jeśli korzystasz z przeglądarki zgodnej z ECMA-262, wydanie 5 (ECMAScript 5) lub Node.js , możesz użyć
Function.prototype.bind
. Opcjonalnie możesz przekazać dowolne argumenty funkcji, aby utworzyć funkcje częściowe .Ponownie w twoim przypadku spróbuj tego:
Ta sama funkcjonalność została również zaimplementowana w Prototype (jakieś inne biblioteki?).
Function.prototype.bind
można zaimplementować w ten sposób, jeśli chcesz mieć niestandardową kompatybilność wsteczną (ale pamiętaj o uwagach).ECMAScript 2015 ( niektóre przeglądarki , Node.js 5.0.0+)
Do najnowocześniejszego rozwoju (2015) możesz użyć funkcji grubych strzał , które są częścią specyfikacji ECMAScript 2015 (Harmony / ES6 / ES2015) ( przykłady ).
W twoim przypadku spróbuj tego:
jQuery
Jeśli już używasz jQuery 1.4+, istnieje gotowa funkcja do jawnego ustawienia
this
kontekstu funkcji.W twoim przypadku spróbuj tego:
Underscore.js , lodash
Jest dostępny w Underscore.js, a także lodash, jako
_.bind(...)
1 , 2W twoim przypadku spróbuj tego:
wiązać jquery underscore.js ecmascript-5 prototypejs node.js
źródło
func.bind(context...)
? Czy coś mi umknęło?var boundFn = fn.bind(this); boundFn(); boundFn();
na przykład.W przeglądarkach innych niż Internet Explorer możesz przekazać parametry do funkcji razem po opóźnieniu:
Możesz to zrobić:
Jest to lepsze pod względem wydajności niż wyszukiwanie zakresu (buforowanie
this
do zmiennej poza wyrażeniem limitu czasu / przedziału), a następnie tworzenie zamknięcia (przy użyciu$.proxy
lubFunction.prototype.bind
).Kod umożliwiający jego działanie w IE z Webreflection :
źródło
UWAGA: To nie będzie działać w IE
źródło
Jeśli używasz
underscore
, możesz użyćbind
.Na przykład
źródło