我正在收集JavaScript类原型,使其与旧浏览器兼容,从不介意,但我想知道,在收集它们时,开发人员在Mozila将数组比较为null我可以看到那是不是因为我可能错了,有一个解释???
if (!Array.prototype.every) {
Array.prototype.every = function(fun /*, thisp */) {
"use strict";
if (this == null)
throw new TypeError();
var t = Object(this);
var len = t.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
var thisp = arguments[1];
for (var i = 0; i < len; i++) {
if (i in t && !fun.call(thisp, t[i], i, t))
return false;
}
return true;
};
}
在这一行
if (this == null)
这是指数组
此代码位于Mozila
当然,我需要一个解释是将数组与null进行比较的逻辑,即使我知道“this”是指一个必须数组类型而不是变量可以是数组还是null?你的想法??
答案 0 :(得分:4)
有人在没有上下文的情况下调用它时可能会发生这种情况,例Array.prototype.every(...)
代替someArray.every(...)
。或者更可能的情况:将someArray.every
作为回调传递给其他函数,然后在没有正确的上下文的情况下调用它。
由于在没有提供上下文时该函数在Strict Mode this === undefined
中运行。并undefined == null
。
答案 1 :(得分:2)
对于以下情况很有用:
Array.prototype.every.call(null, ...);
您不太可能遇到该版本的代码,但代替null
可以是一个尚未初始化的变量。在这种情况下,TypeError
只是合乎逻辑的。