在类似于jQuery的vanilla JS中实现每个

时间:2012-01-30 19:14:54

标签: javascript jquery syntax

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

2 个答案:

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