Javascript call()函数 - 额外参数

时间:2014-10-07 01:21:29

标签: javascript

我正在阅读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()函数中ia参数的用途是什么?如果我删除它们,我会得到相同的结果。

4 个答案:

答案 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),因此此处ia完全是多余的(并没有使用)。该函数仅使用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()调用它时,其余两个参数基本上被忽略。