Почему бы не вызвать ошибку TypeError, когда `this == null` - PullRequest
0 голосов
/ 26 сентября 2018
Array.prototype._find = function(callbackfn, thisArg) {
  if (this == null) {
    throw new TypeError('this is null or not defined')
  }
  if (typeof callbackfn !== 'function') {
    throw new TypeError('callbackfn is not a function')
  }

  for (let i in this) {
    if (callbackfn.call(thisArg, this[i], i, this)) return this[i]
  }

  return undefined
}

console.log(Array.prototype._find.call(null, x => x > 21))

Это полифайл Array.prototype.find, я исключаю триггер TypeError при запуске console.log(Array.prototype._find.call(null, x => x > 21)), я путаюсь, почему бы не вызвать триггер TypeError

1 Ответ

0 голосов
/ 26 сентября 2018

Вы, вероятно, выполняете свою функцию в "нестрогом" режиме.Согласно документации:

function.call(thisArg, arg1, arg2, ...)

thisArg

Дополнительно.Значение этого предусмотрено для вызова функции.Обратите внимание, что это может не быть фактическим значением, видимым методом: , если метод является функцией в нестрогом режиме, null и undefined будут заменены глобальным объектом , а примитивные значения будутбыть преобразованным в объекты.

Со страницы MDN на Function.prototype.call , выделено

Вот пример.Первый блок работает в строгом режиме и регистрирует null.Второй будет записывать window, так как это глобальная область видимости вашего браузера.(Пожалуйста, дайте фрагменту стека некоторое время для регистрации объекта окна, это довольно медленно)

(function() {
  "use strict";
  
  function logThis() { console.log("strict:", this); }
  
  logThis.call(null);

}());

(function() {
  
  function logThis() { console.log("non-strict:", this); }
  
  logThis.call(null);

}());
...