首頁  >  問答  >  主體

javascript - call的疑問

《JavaScript權威指南》上有一段用來實作Array.prototype.map的函數:

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都是指向全域啊

PHP中文网PHP中文网2687 天前672

全部回覆(2)我來回復

  • PHP中文网

    PHP中文网2017-05-19 10:46:24

    你可以看到,在這裡實現的map是這種形式的, 即 map(array, f),也就是只能用兩個參數來調用,
    我們再看一下MDN上給出的函數原型,

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

    callback也就是我們所說的f,那麼最後一個this是可選的,而書上提供的函數根本就沒有考慮這個值,那麼當不傳這個值的時候,如果省略了thisArg 參數,或者賦值為null 或undefined,則this 指向全域物件。
    此外,我們已知在使用函數物件call方法時,

    如果這個函數處於非嚴格模式下,則指定為null和undefined的this值會自動指向全域物件(瀏覽器中就是window物件),同時值為原始值(數字,字串,布林值)的this會指向該原始值的自動包裝物件。

    總之,一句話為了完全模擬map函數的性質~

    回覆
    0
  • 滿天的星座

    滿天的星座2017-05-19 10:46:24

    /q/10...

    回覆
    0
  • 取消回覆