对象内的forEach函数

时间:2017-01-30 10:53:10

标签: javascript foreach

我对这段代码有疑问。

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("*********")

如果我在我的控制台中运行此代码,我会得到这个:

John
Jen
Tony
*********
John
Jen
Tony
undefined
*********

这意味着在我的prob函数之前,我调用我的trim函数运行。这是为什么?我没有打电话给它?我可以将它保存为对象上的方法,并在以后需要时调用它吗?

3 个答案:

答案 0 :(得分:8)

调用names.forEach尝试将返回值分配给trim。把它放在一个函数中应该可以工作。

&#13;
&#13;
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());
&#13;
&#13;
&#13;

答案 1 :(得分:1)

此行为的说明:

obj.prob被分配了一个函数声明,并且不是被调用。

obj.trim设置对函数forEach的调用。

这意味着当您分配给属性时,您也会导致代码运行 (当您实例化obj对象时会发生这种情况,这解释了名称的初始记录)

建议的解决方案:

forEach的调用包装到匿名函数声明中(就像使用prob属性的for循环一样):

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)
          });
       }
};

答案 2 :(得分:0)

您只需将each功能包含在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("*********")