Nie noodwendig nie -- dit is omdat die indexOf()
inheemse funksie gebruik die direkte this
waarde wat deurgegee is, nie die een wat na 'n voorwerp omgeskakel is nie (gelykstaande aan wat in 'n streng modus gebeur), en so 'n shim sal moet kontroleer dat dit voldoen.Byvoorbeeld, hierdie kode sal 'n gooi TypeError
:
var a = Array.prototype.indexOf;
a();
Dit sal 'n gooi TypeError
, as die this
waarde word nie in 'n voorwerp omgeskakel of na die globale voorwerp verander nie.In gebruiker-gedefinieerde nie-streng funksies, die waarde van this
is die globale voorwerp as daar geen ouervoorwerp is nie, maar in ES5 streng modus word dit deurgegee as undefined
self.Nog 'n situasie is wanneer jy dit spesifiek met een van die twee noem null
of undefined
:
"use strict";
Array.prototype.indexOf.call(null); // TypeError, what else can we do?
In die ES5-spesifikasie, die hierdie waarde verwys na die oorspronklike waarde wat as die thisArg
, sonder enige veranderinge.In nie-streng modus, die hierdie waarde is nie toeganklik vir kode in gebruikergedefinieerde funksies nie, maar inheemse funksies is in staat om eksplisiet gebruik van die hierdie waarde in plaas van wat die this
sleutelwoord evalueer na (wat na verwys word as die ThisBinding
in die spesifikasie).In streng modus evalueer hulle albei na dieselfde ding.
Omdat die oorspronklike weergawe in staat is om toegang tot die nie-boks weergawe van die this
waarde in nie-streng modus (wat direk na die interne funksie oorgedra word [[ToObject]]
, wat gooi 'n TypeError
by 'n poging om te bekeer null
of undefined
), moet hierdie kontrole geïmplementeer word om aan die vereistes van die spesifikasie te voldoen.
Let wel:tegnies is die kodevoorbeeld in jou vraag nie nogal deur die ES5-spesifikasie, soos die this
waarde kan vals wees, wat dit sal misluk, selfs al moet dit in teorie voortgaan (inheemse implementering van indexOf()
gooi nie as false
word deurgegee as die this
waarde).Sowel, aangesien die globale voorwerp geslaag sou word as hierdie waarde eintlik ongedefinieerd of nul was, sou dit die if (!this)
toets, selfs wanneer dit nie veronderstel is nie.Dit kan nie opgelos word bloot deur te kontroleer dat die argument nie die globale voorwerp is nie, want dit sal misluk as die globale voorwerp eksplisiet geslaag word (wat toegelaat word).