javascript - page - "This" inside object
javascript injection attack (5)
Cuando utiliza esto en una declaración de objeto JSON, apunta a la instancia actual.
Puede probar este código en su consola para entenderlo mejor:
Object({ w : 560, h : (312 - 42) / (560 / function(e){console.log(e);return e.w;}(this)) + 42 });
Esta pregunta ya tiene una respuesta aquí:
- Autorreferencias en declaraciones literales de objetos 20 respuestas
Estoy tratando de calcular una altura proporcional (excluyendo un elemento de altura estática) de un ancho que se transfiere a través de una solicitud (por defecto es 560).
Sin embargo, wF.h
evalúa a NaN
. Si reemplazo this.w
por 560, funciona, pero no cuando trato de hacer referencia a la propiedad w
de wF
.
var wF = {
w : 560,
h : (312 - 42) / (560 / this.w) + 42
};
¿Lo que da?
Me rehúso a usar dos vars simples en sucesión, porque estoy tratando de obtener un buen código de JS.
Actualizar:
Gracias a todos los que me ayudaron a explicar y resolver mi problema. Supongo que tendré que acostumbrarme a eso. Voy a configurar el objeto en etapas para continuar con el proyecto, a pesar de que todavía me molesta un poco;). Encontré y leí un buen artículo sobre el tema para cualquier persona que se tope con problemas similares: http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/
Hola, redefino tu segunda propiedad como un objeto de función y funcionará. Creo que es posible acceder al contexto del objeto que llama desde dentro de una función
var wF = {
w : 560,
h : function() { return (312 - 42) / (560 / this.w) + 42; }
};
alert(wF.h())
La palabra clave this
refiere al contexto de llamada, no a un objeto.
Necesitas hacer esto en dos pasos como ese:
var wF = { w: 560 };
wF.h = (312 - 42) / (560 / wF.w) + 42;
No necesita envolver el {...} en un objeto (). Ya es un objeto literal.
this
no opera dentro del objeto literal, apuntará al objeto en el que se está ejecutando actualmente la función así:
function fn() {
var wF = { w : 560, h : (312 - 42) / (560 / this.w) + 42 };
}
fn();
hará que this
apunte al objeto window
.
EDITAR: El código anterior no fue una respuesta, solo una demostración de lo que es this
. Otra posibilidad sería usar una función que tome el ancho como argumento:
function getObject(width) {
width = width || 560; //Default value to 560
return { w: width, h : (312 - 42) / (560 / width) + 42 };
}
var wF = getObject(); //To get the default value, or specify a width otherwise.
// Your code
var wF = {
w : 560,
h : (312 - 42) / (560 / this.w) + 42
};
this
no es lo que crees que es
Javascript no tiene ámbito de bloque, solo alcance de función: this
dentro de la definición de wF
no se refiere a wF
.
(Y entonces esto this.w
, sea this
sea, probablemente undefined
esté undefined
. Dividir por rendimientos undefined
NaN
.)
Entonces, puede intentar:
// Let''s not use `this`
var wF = {
w : 560,
h : (312 - 42) / (560 / wF.w) + 42
};
Aún no has terminado de definir el objeto
Sin embargo, todavía está definiendo el objeto donde intenta usar wF.w
: todavía no está listo para eso .
Solución
Entonces, sí, tendrá que usar dos variables ... o configurar el objeto por etapas:
// We can''t even use `wF`; split up the property definitions
var wF = {};
wF.w = 560;
wF.h = (312 - 42) / (560 / wF.w) + 42;