好的,我的问题来自一本我试图理解的书的例子。请记住我刚进入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;
}
答案 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_func
,my_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_func
,my_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];