Não necessariamente - é porque o indexOf()
Função nativa usa o direto this
valor aprovado, não aquele convertido em um objeto (equivalente ao que acontece no modo rigoroso), e esse calço precisaria verificar se isso fosse compatível. Por exemplo, este código jogará um TypeError
:
var a = Array.prototype.indexOf;
a();
Vai jogar um TypeError
, Enquanto o this
O valor não é convertido em um objeto ou alterado para o objeto global. Nas funções não rigíveis definidas pelo usuário, o valor de this
é o objeto global se não houver objeto pai, mas no modo estrito ES5, ele é passado como undefined
em si. Outra situação é quando você chama especificamente com qualquer null
ou undefined
:
"use strict";
Array.prototype.indexOf.call(null); // TypeError, what else can we do?
Na especificação ES5, a isto valor refere -se ao valor original aprovado como o thisArg
, sem nenhuma alteração. No modo não rito, a isto valor não é acessível ao código em funções definidas pelo usuário, mas as funções nativas são capazes de especificar explicitamente o uso de a isto valor em vez do que o this
a palavra -chave avalia (que é referido como o ThisBinding
na especificação). No modo rigoroso, ambos avaliam a mesma coisa.
Porque a versão nativa pode acessar a versão não caixa do this
valor no modo não rigoroso (que é passado diretamente para a função interna [[ToObject]]
, que joga um TypeError
Ao tentar converter null
ou undefined
), essa verificação precisa ser implementada para atender aos requisitos da especificação.
Nota: Tecnicamente, a amostra de código em sua pergunta não é bastante pela especificação ES5, como o this
o valor pode ser falsamente, o que falharia, mesmo que deve proceder em teoria (implementações nativas de indexOf()
Não jogue se false
é passado como o this
valor). Também, já que o objeto global seria aprovado se o valor deste era realmente indefinido ou nulo, passava pelo if (!this)
teste, mesmo quando não deve. Isso não pode ser resolvido simplesmente verificando se o argumento não é o objeto global, porque isso falharia se o objeto global fosse explicitamente aprovado (o que é permitido).