Javascript 在vanila JS中实现每一个,类似于jQuery

Javascript 在vanila JS中实现每一个,类似于jQuery,javascript,jquery,syntax,Javascript,Jquery,Syntax,我在JS中实现了每个函数,如下所示: 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中实现了
每个
函数,如下所示:

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

您的实现看起来不错

{'a':'apple','b':'bat','c':'cat'}。每个…
都会产生错误,因为它的语法不正确。封闭在
()
内部,它将起作用

试试这个

({'a' : 'apple', 'b' : 'bat', 'c' : 'cat'}).each(function(i){
   alert(i);
});

您的实现看起来不错

{'a':'apple','b':'bat','c':'cat'}。每个…
都会产生错误,因为它的语法不正确。封闭在
()
内部,它将起作用

试试这个

({'a' : 'apple', 'b' : 'bat', 'c' : 'cat'}).each(function(i){
   alert(i);
});

您需要在对象周围放上括号,否则它将由于左括号和右括号而将其解释为块

({'a' : 'apple', 'b' : 'bat', 'c' : 'cat'}).each(function(i){
   alert(i);
});
如果不使用括号,解释器将“看到”以下内容:

这是一个带有单个表达式的块。但是,由于该表达式无效,它将返回语法错误。即使它是一个有效的表达式,它仍然会给您一个错误,因为块没有属性,因此点属性访问表示法不适用:

{ console.log("hello world"); }.each(function(){})

因此,您需要通过将对象用括号括起来以消除歧义来告诉解释器该对象是一个表达式(因为您不能将语句放在仅用括号括起来的表达式中)。

您需要将对象用括号括起来,否则它将由于左括号和右括号而将其解释为一个块

({'a' : 'apple', 'b' : 'bat', 'c' : 'cat'}).each(function(i){
   alert(i);
});
如果不使用括号,解释器将“看到”以下内容:

这是一个带有单个表达式的块。但是,由于该表达式无效,它将返回语法错误。即使它是一个有效的表达式,它仍然会给您一个错误,因为块没有属性,因此点属性访问表示法不适用:

{ console.log("hello world"); }.each(function(){})

因此,您需要通过将对象括在括号中以消除歧义来告诉解释器该对象是一个表达式(因为您不能将语句放在只有括号的表达式中)。

我也注意到了这一点,但您能解释为什么它在语法上不正确吗?因为当有开括号和关括号时,JavaScript引擎将其视为一个块,并且不能在脚本块上调用方法<代码>函数()。但是
(function(){})。something()
会起作用。我也注意到了这一点,但您能解释一下为什么它在语法上是不正确的吗?因为当有打开和关闭cur括号时,JavaScript引擎将其视为一个块,并且您不能在脚本块上调用方法<代码>函数()。但是
(function(){})。有些东西()
会起作用。顺便问一下,我的每个实现都正常吗?或者有什么问题吗?@Dev555我想如果你这样做可能会更有用:
fn.call(this,x,this[x])
而不仅仅是
fn(x)
。否则,我看不出它有任何明显的错误。@Dev555您也应该阅读,这样您就可以了解如何定义不可枚举的属性,这样您的方法就不会在
循环中出现
。顺便问一下,我的每个实现是否都正常,或者有什么问题吗?@Dev555我认为如果您这样做了,它可能会更有用:
fn.call(this,x,this[x])
而不仅仅是
fn(x)
。否则,我看不出它有什么明显的错误。@Dev555您还应该阅读,这样您就可以了解如何定义不可枚举的属性,这样您的方法就不会在
for in
循环中结束。