Object.prototype.e = function() {
[].forEach.call(this, function(e) {
return e;
});
};
var w = [1,2];
w.e(); // undefined
但是如果我改用警报,这会起作用
// ...
[].forEach.call(this, function(e) {
alert(e);
});
// ...
w.e(); // 1, 2
Object.prototype.e = function() {
[].forEach.call(this, function(e) {
return e;
});
};
var w = [1,2];
w.e(); // undefined
但是如果我改用警报,这会起作用
// ...
[].forEach.call(this, function(e) {
alert(e);
});
// ...
w.e(); // 1, 2
我意识到这是一个老问题,但是当您搜索此主题时,这是 google 上出现的第一件事,我会提到您可能正在寻找的是 javascript 的 for.. in 循环,它的行为更接近于许多其他语言中的 for-each,如 C#、C++ 等......
for(var x in enumerable) { /*code here*/ }
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for...in
http://jsfiddle.net/danShumway/e4AUK/1/
需要记住的几件事:
编辑: for..in 将(至少)返回添加到对象原型的属性。如果这是不希望的,您可以通过将您的逻辑包装在额外的检查中来纠正此行为:
for(var x in object) {
if(object.hasOwnProperty(x)) {
console.log(x + ": " + object[x]);
}
}
该函数e()
没有返回任何东西;内部匿名函数正在返回其 e
值,但该返回值被调用者忽略(调用者是function e()
(并且“e”的多次使用会变得更加混乱吗?))
你的例子有点奇怪,但随着这个问题正在成为规范的“从forEach
”问题,让我们用更简单的东西来演示这个问题:
在这里,我们有一个函数来检查数组中的条目是否someProp
匹配value
,如果匹配,则增加count
条目上的 并返回条目:
function updateAndReturnMatch(array, value) {
array.forEach(function(entry) {
if (entry.someProp == value) {
++entry.count;
return entry;
}
});
}
但是即使找到并更新了条目,调用也会updateAndReturnMatch
为我们提供undefined
。
其原因是,return
里面forEach
从回调函数返回的回调,而不是从updateAndReturnMatch
。记住,回调是一个函数;return
在一个函数中从那个函数返回,而不是包含它的那个。
要从 返回updateAndReturnMatch
,我们需要记住条目并打破循环。由于您无法打破forEach
循环,我们将some
改为使用:
function updateAndReturnMatch(array, value) {
var foundEntry;
array.some(function(entry) {
if (entry.someProp == value) {
foundEntry = entry;
++foundEntry.count;
return true; // <== Breaks out of the `some` loop
}
});
return foundEntry;
}
在return true
我们返回some
的回调,而return foundEntry
从回报updateAndReturnMatch
。
有时这就是你想要的,但通常上面的模式可以替换为Array#find
,这是 ES2015 中的新内容,但可以为旧浏览器填充:
function updateAndReturnMatch(array, value) {
var foundEntry = array.find(function(entry) {
return entry.someProp == value;
});
if (foundEntry) {
++foundEntry.count;
}
return foundEntry;
}
因为
function(e) {
return e;
}
是回调。Array.forEach 很可能以这种方式调用它:
function forEach(callback) {
for(i;i<length;i++) {
item = arr[i];
callback.call(context, item, i, etc.)
}
}
所以回调被调用,但返回不会去任何地方。如果回调被调用如下:
return callback.call();
它将在数组中的第一项上从 forEach 返回。