gpt4 book ai didi

javascript - JavaScript 中的错误异常。 TypeError 调用不是一个函数

转载 作者:太空宇宙 更新时间:2023-11-04 15:34:30 25 4
gpt4 key购买 nike

我一直在研究 JavaScript 中的 call 方法,发现了一些有趣的东西:

我正在创建一个自定义 map 函数,我做了这样的事情:

function map(collection, callback, context) {
if (!collection || !collection.hasOwnProperty('length') || typeof(callback) !== 'function') {
throw new TypeError();
}

var newArray = [];
var isFunction = typeof(callback.call) === 'function'; // this I added after to prove my point.
console.log('is callback.call a function? ' + (isFunction ? 'yes it is!' : 'no, it is not a function'));
for (var i = 0, len = collection.length; i < len; i++) {
newArray[i] = callback.call(context, collection[i], i, collection);
}

return newArray;
}

此时我执行了我的map具有以下参数的函数:

var arr = map(Array.apply(null, { length: 2 }), Number.call);

我跳过了上下文参数的值,所以它是 undefined 。这应该很酷。还有一点奇怪的是 callback我通过了call方法最后:我调用 call方法call方法(这也很酷)。

但由于未知原因,浏览器给了我这个错误:

is callback.call a function? yes it is!
Uncaught TypeError: callback.call is not a function
at map (eval at map (:10:9), <anonymous>:10:32)
at eval (eval at map (:10:9), <anonymous>:15:11)
at map (<anonymous>:10:9)
at <anonymous>:1:1

我想知道这背后的真正原因是什么。 callback.call肯定是一个函数。 有什么办法可以处理这样的情况吗?如何检查提供的参数是否会给我这样的错误?

当我提供上下文时:

map(Array.apply(null, { length: 2 }), Number.call, Number)
// is callback.call a function? yes it is!
// [0, 1]

CodePen (控制台中缺少错误,我建议使用浏览器重现)

编辑:根本不需要澄清上下文:

map([1, 2], function(i) {
return i + 5;
});
// is callback.call a function? yes it is!
// [6, 7]

编辑#2我可以看到其他问题与我的问题有什么关系。他们解释了这背后的原因,在 Firefox 上也有很好的错误消息:

TypeError: Function.prototype.call called on incompatible undefined

所以我的最后一个问题是:

有没有办法检测这种“不兼容”?

最佳答案

您正在将 Number.call 函数作为参数传递。因此,在您的 map 函数中 callback 变量现在已经是 Number.call 函数。那么你不应该再使用callback.call。只需使用回调就可以解决问题。

这只是我的 2 美分想法。希望对您有帮助!

编辑:因为callFunction.prototype的函数,所以它会出现在每个函数实例中。它需要 this 上下文作为一个函数。当您将 Number.call 传递给新的 map 时,您已经失去了上下文,因为在新的 map 中,this 不再是一个函数。

关于javascript - JavaScript 中的错误异常。 TypeError 调用不是一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44508063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com