在《JavaScript權(quán)威指南》上有一段用來實(shí)作Array.prototype.map
的函數(shù):
var map = function(a,f){
var results = [];
for(var i = 0,l = a.length; i<l; i++){
if(i in a){
results[i] = f.call(null,a[i],i,a);//這里
}
}
return results;
};
為什麼要用call(null)
而不是直接用f(a[i], i, a)
?這樣this都是指向全域啊
認(rèn)證高級PHP講師
你可以看到,在這裡實(shí)現(xiàn)的map是這種形式的, 即 map(array, f),也就是只能用兩個參數(shù)來調(diào)用,
我們再看一下MDN上給出的函數(shù)原型,
const new_array = arr.map(callback[, thisArg])
callback也就是我們所說的f,那麼最後一個this是可選的,而書上提供的函數(shù)根本就沒有考慮這個值,那麼當(dāng)不傳這個值的時候,如果省略了thisArg 參數(shù),或者賦值為null 或undefined,則this 指向全域物件。
此外,我們已知在使用函數(shù)物件call方法時,
如果這個函數(shù)處於非嚴(yán)格模式下,則指定為null和undefined的this值會自動指向全域物件(瀏覽器中就是window物件),同時值為原始值(數(shù)字,字串,布林值)的this會指向該原始值的自動包裝物件。
總之,一句話為了完全模擬map函數(shù)的性質(zhì)~