Piszę podstawowy opakowanie do interfejsu API WebKit (nowa wersja To API) dla mnie do użycia. Mój aktualny problem jest funkcją queryUsageAndQuota()
.
Moja owijarka wokół tej konkretnej funkcji pierwotnie wyglądała:
self.pers.getQuota = function() {
self.pers.queryUsageAndQuota(function(usage,quota) {
return quota;
});
}
// self is a reference to the top level of this 'wrapper'
Dlatego też nazwałbym var quota = self.pers.getQuota();
i miałem kwotę wrócił.
Po tym nie powiodło się, spojrzałem na To pytanie i zmieniło go, więc ja Zamiast tego używał wywołania zwrotnego zdefiniowanego przez użytkownika. Teraz funkcja to:
self.pers.getQuota = function(callback) {
self.pers.queryUsageAndQuota(function(usage,quota) {
callback.call(quota);
});
}
Jednak wykonując tę linię:
self.pers.getQuota(function(quota) {
console.log(quota);
});
Pokazuje undefined
w dzienniku. Nie mogę zrozumieć dlaczego, ponieważ kiedy wykonuję podstawową funkcję navigator.webkitPersistentStorage.queryUsageAndQuota()
, otrzymuję odpowiedni numer z niego.
2 odpowiedzi
.call
nie działa tak, jak myślisz, że tak. Zamiast tego zrobić callback.call(null, quota)
.
Rzeczywisty podpis zarówno dla Function.prototype.call
(i podobnie dla apply
) jest
Function.prototype.call(valueOfThis, valueOfParam1, valueOfParam2, ...);
Dlatego często mówię, że słowo kluczowe this
w JavaScript jest głupie i powinieneś unikać używania go. Po prostu jest kolejnym parametrem jak wszystkie inne, po prostu nie należy określić żadnej nazwy. Jest to ślad stworzenia JavaScript, gdy Netscape upoważnił, że język oparty na schemacie wygląda jak java.
Nawiasem mówiąc, można użyć trzeciego sposobu wywołania metod tutaj. Po prostu
callback(quota);
Ma to jednak efekt uboczny, aby jak JavaScript przejmuje się w to, co chcesz this
, aby być obiektem globalnym {X1}} w tym przypadku). Dopóki nie używasz this
, prosta składnia działa świetnie.
Jeśli faktycznie naprawdę chcesz zwrócić wartość, a nie przekazywać spojrzenie na obiecanie JavaScript. Nie mogę powiedzieć, który z nich używał bez wiedzy, w jakich środowiskach, w których jesteś i jakie biblioteki używasz, ale jQuery ma dobre wdrożenie w obiekcie odroczonym
Próbować
self.pers.getQuota = function(callback) {
self.pers.queryUsageAndQuota(function(usage,quota) {
callback(quota);
});
}
lub
self.pers.getQuota = function(callback) {
self.pers.queryUsageAndQuota(function(usage,quota) {
callback.call(/* an object as 'this'*/, quota);
});
}
Lub
self.pers.getQuota = function(callback) {
self.pers.queryUsageAndQuota(function(usage,quota) {
callback.apply(/* an object as 'this'*/, [quota]);
});
}