在javascript中的foreach函数

时间:2011-06-22 04:14:16

标签: javascript

好的,我的问题来自一本我试图理解的书的例子。请记住我刚进入javascript。

所以我们有了对象集,我们定义了foreach函数。它需要另一个函数作为参数,并为属于set的数组“values”的每个项调用它。

set.foreach = function(f,c) {
    for(var i = 0; i < this.values.length; i++) 
        f.call(c,this.values[i]);
};

到目前为止一直很好......

但我无法理解第二个snipet中foreach函数的用法。特别是我不理解变量v的作用。它没有在书中的其他地方定义而且我真的很难理解这是如何工作的。我们在set中定义另一个函数,将值作为数组

set.toArray = function() {
    var a = [];
    this.foreach(function(v) { a.push(v); }); //where did v came from???
    return a;
}

6 个答案:

答案 0 :(得分:13)

set.foreach = function(f,c) {
    for(var i = 0; i < this.values.length; i++) 
        f.call(c,this.values[i]);
}; //                 ^-------------- being passed right here

您传入的功能为f,并且调用f时,其调用上下文的this值设置为c,并且this.values[i]已通过作为第一个论点。

       // ------v---------your function "f" in the forEach
this.foreach(function(v) { a.push(v); });
       // ------------^------references the first argument (after the "this" arg)
       //                      that was passed to "f"

这是一个更简单的例子:

此函数接受函数作为参数。它唯一能做的就是调用函数:

function my_func( fn ) {
    fn();
}

   // call my_func, which will call the function you give it
my_func( function() { alert( "hi" ); } );

直播示例: http://jsfiddle.net/6a54b/1/

...所以将函数传递给my_func会提醒字符串“hi”。毫不奇怪。


但如果my_func提供了要提醒的值,该怎么办?

function my_func( fn ) {
    fn( "message from my_func" );  // call the fn passed, giving it an argument
}  //            ^------------------------------------------------|
   //                                                             |
   //               v------references the arg passed by my_func---|
my_func( function( arg ) { alert( arg ); } );

直播示例: http://jsfiddle.net/6a54b/

现在你可以看到一个参数被传递给我们发送的函数,并且我们用arg参数引用该参数。

警告my_func提供的任何内容。


我们甚至可以更进一步,将第二个参数传递给my_funcmy_func将简单地将其传递给我们传入的函数。

function my_func( fn, str ) {
    fn( str );  // call the fn passed, giving it
}                                  //    the string we passed in

   //               v------the arg we passed here-----v
my_func( function( arg ) { alert( arg ); }, "I'm getting dizzy!" );

直播示例: http://jsfiddle.net/6a54b/2/

你可以看到两个参数都给了my_funcmy_func调用了我们传入的函数,并传递了我们给它的字符串参数。

答案 1 :(得分:0)

变量v是传递给函数的参数。它允许您使用函数接收的任何内容。它与以下示例中的name没有区别:

function sayHello(name) {
  console.log('Hello '+name);
}

答案 2 :(得分:0)

f.call表示使用参数f调用函数this.values[i]。 foreach中this已设置。 关于从foreach调用toArray,使用v传递函数,values[i] in foreach变为v in toArray

答案 3 :(得分:0)

在这种情况下,

v从调用语句f.call(c, this.values[i])传入。具体来说,它是this.values[i]

以上陈述仅相当于:

f(this.values[i])

其中f是第二个代码段(function(v){ a.push(v); });

中的函数

键入.call而不是仅调用它的原因是可以设置this属性,因此第二个函数中的this是数组本身,这意味着你可以类型:

function(v){
   alert(this.length); // "this" == array
}

答案 4 :(得分:0)

很多答案,这是一个特定于你的问题的答案。

> this.foreach(function(v) { a.push(v); }); //where did v came from???

在传递给 foreach 的函数表达式中, v 是一个形式参数。将标识符作为形式参数包含或多或少等效于使用 var 在函数体中声明它。如果写成:

,也许更清楚
this.foreach( function (v) {
    a.push(v);
});
是不是......

答案 5 :(得分:-1)

v代表列表中的每个项目,因为foreach()函数会循环显示它们。

所以,如果你的“set”中有10个项目,那么该函数将被调用10次,将该集合中的每个项目作为参数v

提供给该函数

例如:

set = [1,2,3,4,5];

set.foreach = function(fn, context) {
  for(var i = 0; i < this.values.length; i++) {
    fn.call(context, this.values[i]);
  }
};

set_times_2 = [];
set.foreach(function(item) {
  set_times_2.push(item);
  set_times_2.push(item);
});

// this is true now:
set_times_2 == [1,1,2,2,3,3,4,4,5,5];