L'ambito di 'questo'
consideri il seguente esempio:
function myClass(message) {
this.message = message;
$('button').click(function(){
this.onClick();
});
}
myClass.prototype.onClick = function() {
alert(this.message);
}
Naturalmente, la linea 3 non funziona : this
funziona su base funzione, e la funzione definita sulla riga 2 avrà il pulsante selezionato come this
invece dell'istanza di myClass. C'è una versione ancora sneakier:
function myClass(message) {
this.message = message;
$('button').click(this.onClick);
}
myClass.prototype.onClick = function() {
alert(this.message);
}
Questa chiama la funzione corretta, ma this
sarebbe ancora il pulsante (perché this
è determinato dal chiamante, non dal fatto che sei una funzione membro).La soluzione corretta è quella di utilizzare una variabile intermedia, come self
, applicare regole di visibilità sane a this
:
function myClass(message) {
this.message = message;
var self = this;
$('button').click(function() { self.onClick(); });
}
Tipo colata
[] == ![]
viene valutato come vero per oscuri motivi
Arrays e Proprietà
Il length
proprietà funziona solo per chiavi intere sugli array. Per esempio:
var a = []; // a.length == 0
a[0] = 'first'; // a.length == 1
a['1'] = 'second'; // a.length == 2
a['x'] = 'third'; // a.length == 2 <-- 'x' does not count
Mentre su questo argomento, for(in)
lavori sugli array, ma traverse tutte proprietà definite sulla matrice. Ciò significa che il tuo codice JavaScript che utilizza lo for(in)
per iterare attraverso gli array cesserà improvvisamente di funzionare su determinati browser quando aggiungi ExtJS al tuo progetto, perché ExtJS definisce Array.prototype.filter
se non è presente (questo è noto come patch di scimmia). Poiché ora filter
è una proprietà personalizzata di ogni oggetto matrice, anche tutti i loop lo eseguono. Boom.
Il modo pulito di iterare attraverso un array consiste nell'utilizzare la lunghezza e un incremento per il ciclo. Oppure jQuery's $.each()
.
fonte
2010-10-13 18:24:07
Contrassegnare come CW se deve sopravvivere alla chiusura .. –
Decisamente dovrebbe essere CW. – Pointy
Grazie per il/i suggerimento/i. – Ender