我看见 在MDN 应该使用的代码 - 如果没有 indexOf 执行 。

该算法与ECMA-262中指定的算法匹配 ... 正如他们所说

这是代码:

/*1*/   if (!Array.prototype.indexOf) {
/*2*/     Array.prototype.indexOf = function (searchElement , fromIndex) {
/*3*/       var i,
/*4*/           pivot = (fromIndex) ? fromIndex : 0,
/*5*/           length;
/*6*/   
/*7*/       if (!this) {
/*8*/         throw new TypeError();
/*9*/       }
/*10*/   
/*11*/       length = this.length;
/*12*/   
/*13*/       if (length === 0 || pivot >= length) {
/*14*/         return -1;
/*15*/       }
/*16*/   
/*17*/       if (pivot < 0) {
/*18*/         pivot = length - Math.abs(pivot);
/*19*/       }
/*20*/   
/*21*/       for (i = pivot; i < length; i++) {
/*22*/         if (this[i] === searchElement) {
/*23*/           return i;
/*24*/         }
/*25*/       }
/*26*/       return -1;
/*27*/     };
/*28*/   }

但是我的问题是关于第7行:

如果我写:

[].indexOf 然后 - this 是阵列本身。 (哎呀,它附着在 Array.prototype.indexOf - 首先)。

我是说 - this 永远是真实的价值。所以 为什么 此检查是否存在?

另外 - Resmanper向我展示了这一点(这是完全合乎逻辑的):

enter image description here

那么 - 为什么存在此检查?我在这里错过了什么吗?

有帮助吗?

解决方案

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top