javascript - tablas - para cada función dentro del objeto
recorrer array de objetos javascript (3)
Tengo una pregunta sobre este fragmento de código.
var names = ["John", "Jen", "Tony"];
var obj = {
prob: function () {
for (var i = 0; i < names.length; i++) {
document.write(names[i]);
console.log(names[i]);
}
},
trim: names.forEach(function(name) {
document.write(name)
console.log(name)
})
}
console.log("*********")
console.log(obj.prob());
console.log("*********")
Si ejecuto este código en mi consola, obtendré esto:
John
Jen
Tony
*********
John
Jen
Tony
undefined
*********
Eso significa que antes de que se ejecute mi función de problema que llamo mi función de recorte. ¿Porqué es eso? Yo no lo llamé? ¿Puedo guardarlo como un método en un objeto y llamarlo más tarde cuando lo necesito?
Explicación de este comportamiento:
obj.prob
se le asigna una declaración de función y no se invoca.
obj.trim
establece una llamada a la función forEach
.
Esto significa que cuando se asigna a la propiedad también está causando que se ejecute el código (esto sucede cuando crea una instancia del objeto obj
, lo que explica el registro inicial de nombres)
Solución sugerida:
Envuelva la invocación de forEach
en una declaración de función anónima (tal como lo hizo con el bucle for para la propiedad prob
):
var names = ["John", "Jen", "Tony"];
var obj = {
prob: function () {
for (var i = 0; i < names.length; i++) {
document.write(names[i]);
console.log(names[i]);
}
},
// the code in this function block will only run
// when trim is invoked
trim: function(){
names.forEach(function(){
document.write(name);
console.log(name)
});
}
};
Los names.forEach
se llaman tratando de asignar el valor de retorno a trim
. Ponerlo dentro de una función debería funcionar.
var names = ["John", "Jen", "Tony"];
var obj = {
prob: function () {
for (var i = 0; i < names.length; i++) {
document.write(names[i]);
console.log(names[i]);
}
},
trim: function () {names.forEach(function(name) {
document.write(name)
console.log(name)
})}
}
console.log("*********")
console.log(obj.prob());
console.log("*********")
console.log(obj.trim());
Solo tienes que ajustar each
función dentro de la function
var names = ["John", "Jen", "Tony"];
var obj = {
prob: function () {
for (var i = 0; i < names.length; i++) {
document.write(names[i]);
console.log(names[i]);
}
},
trim: function(){ names.forEach(function(name) {
alert();
document.write(name)
console.log(name)
})}
}
console.log("*********")
console.log(obj.prob());
console.log("*********")