Pomocy," to " mnie myli w JavaScript
Praca z JavaScript jedną z rzeczy mylących jest użycie tego
var x = {
ele : 'test',
init : function(){
alert(this.ele);
}
}
Jednak gdy mamy do czynienia z wieloma obiektami, a zwłaszcza zdarzeniami, kontekst this
zmienia się i staje się mylący, aby śledzić/rozumieć.
Więc jeśli ktoś ma lepsze wejścia / wytyczne/myśli / lepsze praktyki, Proszę podzielić się. Również chciałbym wiedzieć, czy użycie this
daje jakąś (wydajność) przewagę czy co?
5 answers
Nie chodzi o wydajność, chodzi o dostęp do właściwości określonej instancji obiektu:-
x.init()
Nie wyświetla "test", jeśli nie użyłeś this
w funkcji.
W praktyce powyższa linia jest taka sama jak:-
x.init.call(x);
Pierwszy parametr w użyciu {[8] } jest przypisany do this
podczas wykonywania funkcji.
Teraz rozważ:-
var fn = x.init; //Note no () so the function itself is assigned to the variable fn
fn();
Teraz nie masz nic w alarmie. To dlatego, że powyższe jest skutecznie: -
fn.call(window);
W przeglądarce hostowanej Javascript obiekt window
jest synonimem obiektu globalnego. Gdy funkcja jest wywoływana "w stanie surowym", to this
domyślnie jest obiektem globalnym.
Klasyczny błąd robi coś takiego:-
var x = {
ele: 'test';
init: function(elem) {
elem.onclick = function() { alert(this.ele); }
}
}
x.init(document.getElementById('myButton'));
To jednak nie działa, ponieważ funkcja dołączona do zdarzenia onclick jest wywoływana przez przeglądarkę za pomocą kodu w stylu:-
onclick.call(theDOMElement)
Stąd gdy funkcja jest uruchomiona this
nie jest to, co myślisz jest.
Moje zwykłe rozwiązanie tej sytuacji to:-
var x = {
ele: 'test';
init: function(elem) {
var self = this;
elem.onclick = function() { alert(self.ele); }
elem = null;
}
}
x.init(document.getElementById('myButton'));
Uwaga elem = null
to obejście wycieku pamięci IE.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-28 04:33:07
To jest bardzo mylące. To zależy od sposobu wywołania funkcji. Doug Crockford dobrze napisał w swojej książce Javascript, The Good Parts . Istotą tego jest ta doskonała odpowiedź na źle sformułowane pytanie.
I nie, tu nie chodzi o wydajność.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:30
Dla mnie bardzo pomogły następujące wytyczne: za każdym razem, gdy widzisz this
myśl owner
. Obiekt, który posiada nazwę zmiennej, do której przypisana jest funkcja, stanie się this
. Jeśli nie możesz zrozumieć, kto jest właścicielem, to this
będzie window.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-29 10:10:53
Dobrym i pouczającym artykułem na temat słowa kluczowego this
jest to (nie zamierzony kalambur). Artykuł może Ci wszystko wyjaśnić, wiem, że zrobił to dla mnie.
Podstawową zasadą jest to, że this
słowo kluczowe wewnątrz funkcji zawsze odnosi się do właściciela funkcji, a kluczem do zrozumienia konsekwencji jest zrozumienie, kiedy funkcje są referowane i kiedy są kopiowane . Zobacz wcześniej wspomniany artykuł dla przykładów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-27 16:25:02
Użyj
var me = this;
Poza
function(){
Wtedy możesz odwołać się do mnie wewnątrz funkcji ()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-27 16:28:39