El alcance de 'esto'
Consideremos el siguiente ejemplo:
function myClass(message) {
this.message = message;
$('button').click(function(){
this.onClick();
});
}
myClass.prototype.onClick = function() {
alert(this.message);
}
Por supuesto, la línea 3 no funciona : this
funciona por función, y la función definida en la línea 2 tendrá el botón seleccionado como this
en lugar de la instancia de myClass. Hay una versión aún más disimulados:
function myClass(message) {
this.message = message;
$('button').click(this.onClick);
}
myClass.prototype.onClick = function() {
alert(this.message);
}
Este llama a la función correcta, pero this
seguiría siendo el botón (porque this
está determinado por la persona que llama, no por el hecho de que usted es un miembro de la función).La solución correcta es utilizar una variable intermedia, tal como self
, para aplicar reglas de alcance sanos a this
:
function myClass(message) {
this.message = message;
var self = this;
$('button').click(function() { self.onClick(); });
}
Tipo de colada
[] == ![]
evalúa a verdadero por razones oscuras
Arrays y Propiedades
ElLa propiedad 10 solo funciona para las claves enteras en las matrices. Por ejemplo:
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
Si bien sobre este tema, for(in)
trabajos sobre matrices, pero atraviesa todos propiedades definidas en la matriz. Esto significa que su código JavaScript que usa for(in)
para iterar a través de matrices dejará de funcionar repentinamente en ciertos navegadores cuando agregue ExtJS a su proyecto, porque ExtJS define Array.prototype.filter
si no está presente (esto se conoce como parche de mono). Dado que ahora filter
es una propiedad personalizada de cada objeto de matriz, todos sus bucles también se repiten a través de él. Auge.
La manera limpia de iterar a través de una matriz es usar la longitud y un incremento para el ciclo. O jQuery's $.each()
.
Marcar como CW si va a sobrevivir al cierre ... –
Definitivamente debería ser CW. – Pointy
Gracias por la (s) propina (s). – Ender