gpt4 book ai didi

javascript - 检测未绑定(bind)的 native 函数,例如 `Array.push` ?

转载 作者:行者123 更新时间:2023-11-28 16:14:09 25 4
gpt4 key购买 nike

请遵守以下规定:

function array_map(array, callback) {
for (var i = 0; i < array.length; i += 1) {
callback(array[i]);
}
}
var a = [], b = [];

array_map([1, 2, 3], function (x) { a.push(x); });
// just gives a = [1, 2, 3] as expected

// but why does this not work: ?
array_map([1, 2, 3], b.push);
// Chrome: a = [], Firefox: can't convert undefined to object

确实理解为什么会发生这种情况,即:如果您传递,push不再绑定(bind)到b(而是绑定(bind)到全局对象)它直接到array_map。我不太明白为什么 Chrome 没有给出错误,至少 Firefox 似乎给出了某种错误。

如何检测这样的函数是否传递给 array_map 以避免此类错误

我希望有先进的反射技术可以用来追踪函数的起源。例如 b.push.constructor 提供 Function,但这不是我想要的。

最佳答案

我不确定您期望发生什么。 Array.prototype.map 需要一个函数作为第二个参数,该函数为每次迭代返回一个 值。

仅传入函数引用(您在第二个示例中执行的操作)并不会告诉函数它必须做什么。所以你有点期待 .map() 应用一些黑魔法并使用正确的参数调用传入的方法,但这显然是做不到的。

我完全不明白你写了自己的映射函数。但是,您的问题是您正在失去该 .push() 函数的范围。仅当您在Array/Object上调用它(如xxx.push())时,被调用函数中的this才会正确引用目标对象。一旦您刚刚传递了引用,this 将指向 global/windowundefined 并且将不起作用不再了。

所以解决这个问题,你可以这样调用它

array_map([1, 2, 3], b.push.bind(b));

这也将应用 ES5 函数。您无法在 array_map() 中真正检测到它。函数就是函数,最好的办法是检测传入的方法是否是 native 方法,但我不建议这样做。

关于javascript - 检测未绑定(bind)的 native 函数,例如 `Array.push` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12038085/

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