解释API函数签名语法

时间:2017-06-17 12:35:55

标签: javascript api syntax signature

阅读文档几年我常常对解释函数签名时常用的语法感到困惑。例如:

来自Mozilla Array.map Docs:

var new_array = arr.map(callback[, thisArg])

文档列出了回调的三个参数:currentValue,index和array,但签名只有这种奇怪的回调[,thisArg]语法。与逗号有什么关系?为什么“回调”旁边有数组括号?这个语法有没有任何文档?这个语法有名字吗?任何帮助将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:0)

括号内的参数表示它们是可选的。

答案 1 :(得分:0)

函数Array.prototype.map期望函数作为第一个参数:

var new_array = arr.map(callback[, thisArg])

方括号表示第二个参数是可选的。您可以使用或不使用第二个参数调用Array.prototype.map。两个函数调用都是有效的:

var array = [1, 2, 3, 4];

var myFunc = function (number) {
  return number * 5;
};

var myFuncUsingThis = function (number) {
  console.log(this);
  return number;
};

var myThisArg = {
  foo: 'bar'
};

console.log(array.map(myFunc));
console.log(array.map(myFuncUsingThis, myThisArg));

最后一个与

相同
console.log(array.map(myFuncUsingThis.bind(myThisArg)));

因此,如果您向Array.prototype.map提供的函数使用this对象,则可以在this调用函数时指定函数的Array.prototype.map对象。使用第二个(可选)参数。

currentValueindexarray完全不同。致电Array.prototype.map时,您无需提供这些信息。相反,Array.prototype.map为您提供它们:它使用这三个参数调用您给它的函数(但您不必使用所有三个参数)。

函数的第一个参数是当前处理的数组中元素的值,第二个参数是该元素的索引,第三个参数是数组本身。

您可以编写一个使用索引参数的函数:

var array = Array(20).fill(0); // an array containing 20 zeros

var evenNumbers = array.map(function (number, index) {
  // number is zero, index is the index of the element we should transform
  return index * 2;
});

console.log(evenNumbers);

如果你看一下Array.prototype.map的(幼稚)实现,也许会有所帮助:

Array.prototype.map = function (callback, thisArg) {
  // "this" is the array on which we work

  var arr = []; // the new array that we build
  var result;
  for (var i = 0; i < this.length; i += 1; i++) {
    result = callback.call(thisArg, this[i], i, this);
    arr[i] = result;
  }
  return arr;
};