Не обязательно - это потому, что indexOf()
Нативная функция использует прямую this
Прошло значение, а не преобразовано в объект (эквивалентный тому, что происходит в строгом режиме), и такому марине нужно было бы проверить, чтобы это соответствовало. Например, этот код бросит TypeError
:
var a = Array.prototype.indexOf;
a();
Он бросит TypeError
, как this
Значение не преобразуется в объект и не изменяется в глобальный объект. В пользовательских не ограниченных функциях значение this
Глобальный объект, если нет родительского объекта, но в строгом режиме ES5 он передается как undefined
сам. Другая ситуация - это, когда вы называете это специально с любым null
или же undefined
:
"use strict";
Array.prototype.indexOf.call(null); // TypeError, what else can we do?
В спецификации ES5, а это ценность относится к первоначальному значению, прошедшению как thisArg
, без каких -либо изменений. В не стройном режиме, а это ценность не доступен для кода в определенных пользователях функциях, но нативные функции могут явно указать использование а это ценность вместо того, что this
Ключевое слово оценивается (которое называется ThisBinding
в спецификации). В строгом режиме они оба оценивают одно и то же.
Потому что нативная версия может получить доступ к нецелесовой версии this
Значение в безразмерном режиме (которое напрямую передается внутренней функции [[ToObject]]
, что бросает TypeError
При попытке преобразовать null
или же undefined
), этот чек должен реализовать, чтобы удовлетворить требования спецификации.
Примечание. Технически, образец кода в вашем вопросе не довольно по спецификации ES5, как this
ценность может быть фальсификацией, что потерпит неудачу, даже если она должна продолжаться в теории (нативные реализации indexOf()
не бросай, если false
передается как this
ценность). Кроме того, поскольку глобальный объект будет пройден, если это значение был фактически неопределенным или нулевым, он прошел if (!this)
Проверьте, даже когда это не должно. Это не может быть решено просто путем проверки того, что аргумент не является глобальным объектом, потому что это не удастся, если глобальный объект будет явно прошел (что разрешено).