阅读文档几年我常常对解释函数签名时常用的语法感到困惑。例如:
var new_array = arr.map(callback[, thisArg])
文档列出了回调的三个参数:currentValue,index和array,但签名只有这种奇怪的回调[,thisArg]语法。与逗号有什么关系?为什么“回调”旁边有数组括号?这个语法有没有任何文档?这个语法有名字吗?任何帮助将不胜感激。
谢谢!
答案 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
对象。使用第二个(可选)参数。
currentValue
,index
和array
完全不同。致电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;
};