No necesariamente, es porque el indexOf()
La función nativa usa el directo this
El valor aprobado, no el convertido en un objeto (equivalente a lo que sucede en modo estricto), y tal cuña necesitaría verificar que esto sea cumplido. Por ejemplo, este código arrojará un TypeError
:
var a = Array.prototype.indexOf;
a();
Arrojará un TypeError
, como el this
El valor no se convierte en un objeto ni se cambia al objeto global. En las funciones no estrictas definidas por el usuario, el valor de this
es el objeto global si no hay objeto principal, pero en el modo ES5 estricto se pasa como undefined
sí mismo. Otra situación es cuando lo llamas específicamente con null
o undefined
:
"use strict";
Array.prototype.indexOf.call(null); // TypeError, what else can we do?
En la especificación ES5, la este valor se refiere al valor original aprobado como el thisArg
, sin ningún cambio. En modo no rictamente, la este valor no es accesible para el código en funciones definidas por el usuario, pero las funciones nativas pueden especificar explícitamente el uso de la este valor en lugar de lo que el this
La palabra clave se evalúa (que se conoce como el ThisBinding
en la especificación). En modo estricto, ambos evalúan lo mismo.
Porque la versión nativa puede acceder a la versión sin caja del this
Valor en el modo no riguroso (que se pasa directamente a la función interna [[ToObject]]
, que arroja un TypeError
Al intentar convertir null
o undefined
), esta verificación debe implementarse para satisfacer los requisitos de la especificación.
Nota: Técnicamente, la muestra de código en su pregunta no es bastante por la especificación ES5, como el this
El valor podría ser fals., Lo que lo fallaría a pesar de que debería proceder en teoría (implementaciones nativas de indexOf()
No tire si false
se pasa como el this
valor). Además, dado que el objeto global se pasaría si el valor este valor en realidad estaba indefinido o nulo, pasaría el if (!this)
Prueba, incluso cuando se supone que no debe. Esto no se puede resolver simplemente verificando que el argumento no es el objeto global, porque esto fallaría si el objeto global se aprobara explícitamente (lo que está permitido).