我正在阅读Javascript: The Definitive Guide 6th Edition
。它教授ECMAscript 5.无论如何,它并没有彻底解释某些事情,比如call()函数。这是关于本书定义的范围:
第一个调用上下文参数之后调用()的任何参数都是传递给调用的函数的值。例如,要将两个数字传递给函数f()并将其作为对象o的方法调用,可以使用如下代码:
f.call(o, 1, 2);
在下一节中,作者构建了一个map
函数。我一直在学习Ruby,所以我知道地图是如何工作的。我的问题是关于使用call()函数的实现。它看起来像这样:
var map = function(a,f, o) {
var results = [];
for(var i = 0, len = a.length; i < len; i++) {
if (i in a)
results[i] = f.call(o || null, a[i], i, a);
}
return results;
};
然后定义一个方形函数并使用map:
function square(x){
return x*x;
}
var array = [1,2,3,4,5];
var results = map(array, square);
call()函数中i
和a
参数的用途是什么?如果我删除它们,我会得到相同的结果。
答案 0 :(得分:2)
Array.prototype.map
is defined将索引和数组传递给回调,以防您需要它们。例如,您可以使用square(x)
:
Math.pow(base, exponent)
var results = [1, 2, 3, 4, 5].map(Math.pow);
console.log(results); // [1, 2, 9, 64, 625]
此map
的行为方式相同。如果在特定情况下不需要它们,则不必使用参数。
答案 1 :(得分:1)
Function.call允许您调用函数,就像它是附加到对象的方法一样。
这意味着您可以拥有一个与对象无关的函数,然后您可以将该函数称为该对象的一部分。这是一个很长的说法,当你使用Function.call时,你告诉JS引擎在函数内部使用'this'时使用第一个参数。
所以:
function set_field_value(name, value) {
// do stuff
this[name] = value;
}
本身没有意义,因为特殊变量'this'没有设置为任何(有意义的) 但是,如果您使用呼叫,您可以将其设置为您想要的任何内容:
// if my_object = some object:
set_field_value.call(my_object, 'firstname', 'bob');
console.log(my_object.firstname); // prints 'bob'
调用的唯一重要参数是第一个,(在上面的例子中,my_object),因为第一个参数在函数内变为'this'。其余参数将“按原样”传递给函数。
所以 - 在你的例子中,i和a参数使得map函数看起来像其他map函数,它们提供正在处理的数组(a)和index(i)。
希望有所帮助,
杰
PS - 我强烈推荐“Javascript:the good parts”这本书 - 它比权威指南更有意义。
答案 2 :(得分:0)
f.call
等于square.call
,而square只需要一个参数(x
),因此此处i
和a
完全是多余的(并没有使用)。该函数仅使用a[i]
。
但是,由于您可以传入任何您想要的函数作为map函数的第二个参数,因此书中可能会出现另一个函数而不是square
,并且该函数需要这些函数两个参数也是如此。或者你可以自己尝试一个例子。
function threeParams(a, b, c) {
return [a, b, c]; // simply puts the three parameters in an array and returns it
}
var array = [1,2,3,4,5];
var results = map(array, threeParams);
答案 3 :(得分:0)
你的主要困惑并不在于call
方法。它更多的是关于javascript如何处理函数参数。
暂时忘掉call
,让我们看一下常规函数,以尽量减少所考虑事项的数量。
在javascript中,允许使用比指定的参数更多的参数调用函数。这不算错误。可以通过arguments
对象访问参数:
function foo (arg1) {
alert('second argument is: ' + arguments[1]);
}
foo('hello','world'); // this is not an error
Javascript还允许使用比指定的参数更少的参数调用函数。同样,这不被视为错误。未公开的参数只是赋值undefined
:
function foo (arg1,arg2, arg3) {
alert('third argument is: ' + arg3);
}
foo('hello'); // this is not an error
这就是它的全部。当传递给map()
的函数定义为接受一个参数但map()
调用它时,其余两个参数基本上被忽略。