call/apply的第一個參數傳null時,有什麼用?

最近在看 axios 的源碼,裏面有一些簡寫,好比:node

utils.forEach(fns, function transform(fn) {
  data = fn(data, headers);
});

好奇心驅使我又去看了下 forEach 的封裝,以下:ios

function forEach(obj, fn) {
  // 循環變量爲空時,直接return
  if (obj === null || typeof obj === 'undefined') {
    return;
  }

  // 若是 obj 不可遍歷,則強制轉爲數組
  if (typeof obj !== 'object') {
    obj = [obj];
  }

  if (isArray(obj)) {
    // 遍歷數組
    for (var i = 0, l = obj.length; i < l; i++) {
      fn.call(null, obj[i], i, obj);
    }
  } else {
    // 遍歷對象
    for (var key in obj) {
      if (Object.prototype.hasOwnProperty.call(obj, key)) {
        fn.call(null, obj[key], key, obj);
      }
    }
  }
}

仔細看,遍歷裏面其實就是執行從外面傳入的 fn,沒必要要使用 call 函數,並且第一個參數傳的是 null,那它有什麼用呢?試着在控制檯執行如下代碼:git

function forEach(obj, fn) {
  for (var i = 0, l = obj.length; i < l; i++) {
    fn.call(null, obj[i], i, obj);
  }
}
var text = '示例文字';
forEach(['a','b','c'],function({console.log(this.text)})

BD2575DA-D098-4386-B322-7C244A7D28CD.png
嗯能看到 call 第一個參數傳 null 時,this 指向了 windowgithub

結論:call/apply 的第一個參數爲 null 時,this 是 js 執行環境的全局變量,瀏覽器中是 window,其餘環境(如node)是 global面試

axiosutils 中封裝的各類數據類型的判斷好全啊哈哈哈,附上地址:https://github.com/axios/axios/blob/master/lib/utils.js,面試的時候太愛問了~~axios

相關文章
相關標籤/搜索