반드시 그런 것은 아닙니다 indexOf()
기본 기능은 직접을 사용합니다 this
통과 된 값은 객체로 변환되지 않은 값 (엄격한 모드에서 발생하는 것과 동일)이 아니며, 그러한 신은 이것을 준수하기 위해 점검해야합니다. 예를 들어,이 코드는 a를 던집니다 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]]
, 던지는 a TypeError
전환을 시도했을 때 null
또는 undefined
),이 점검은 사양의 요구 사항을 충족시키기 위해 구현해야합니다.
참고 : 기술적으로 질문의 코드 샘플은 상당히 ES5 사양에 따라 this
가치는 거짓일 수 있으며, 이론적으로 진행해야하더라도 실패 할 수 있습니다 (기본 구현 indexOf()
던지지 마십시오 false
로 전달됩니다 this
값). 또한 글로벌 객체가 통과되기 때문에 이 값 실제로 정의되지 않았거나 널이면서 통과 할 것입니다. if (!this)
그렇지 않은 경우에도 테스트하십시오. 이것은 글로벌 객체가 명시 적으로 통과 된 경우 (허용되는) 인수가 글로벌 대상이 아닌지 확인하면 단순히 해결할 수 없습니다.