我在JS中实现了这样的each
函数:
Object.prototype.each = function(fn){
for (var x in this){
if (this.hasOwnProperty(x)){
fn(x);
}
}
return this;
};
var o = {'a' : 'apple', 'b' : 'bat', 'c' : 'cat'};
o.each(function(i){
alert(i);
});
虽然这很好用。它有什么不对吗?问,因为我正在学习JS。
如果我这样做,为什么会产生错误:
{'a' : 'apple', 'b' : 'bat', 'c' : 'cat'}.each(function(i){
alert(i);
});
答案 0 :(得分:3)
您需要在对象周围放置圆括号,否则由于左右大括号,它会将其解释为块。
({'a' : 'apple', 'b' : 'bat', 'c' : 'cat'}).each(function(i){
alert(i);
});
当你没有括号时,翻译将“看到”这个:
{ // open block statement
'a' : 'apple', 'b' : 'bat', 'c' : 'cat' // not a valid expression!
}.each(function(i){ // there's no dot property access notation for statements!
alert(i);
});
具有单个表达式的块。但是,由于这不是有效的表达式,因此会返回语法错误。即使它是一个有效的表达式,它仍然会给你一个错误,因为块没有属性,因此点属性访问符号不适用:
{ console.log("hello world"); }.each(function(){})
因此,您需要告诉解释器该对象是一个表达式,方法是将它包装在括号中以消除歧义(因为您不能将语句放在括号内 - 只有表达式)。
答案 1 :(得分:1)
您的实施看起来不错。
{'a' : 'apple', 'b' : 'bat', 'c' : 'cat'}.each...
会产生错误,因为它在语法上是不正确的。封闭在()
内,它会起作用。
试试这个。
({'a' : 'apple', 'b' : 'bat', 'c' : 'cat'}).each(function(i){
alert(i);
});