不一定 - 是因为 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)
测试,即使不应该这样做。不能通过检查参数不是全局对象来解决这一问题,因为如果全局对象被明确传递(允许),这将失败。