作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这似乎是矛盾的......在 Chrome 控制台中:
> var forEach = Array.prototype.forEach.call;
> forEach
function call() { [native code] }
> Object.getPrototypeOf(forEach);
function () {}
> forEach([1,2,3], function(a) { console.log(a); });
Uncaught TypeError: forEach is not a function
我猜在 JS 内部 function.call 不完全像普通函数一样对待?
最佳答案
你也可以这样做,如果你想做 forEach(array, fn)
var forEach = Function.call.bind(Array.prototype.forEach);
现在您可以像以前一样使用它了:
forEach([1,2,3], function(a) { console.log(a); });
您正在做的是将调用 this
绑定(bind)到 Array.prototype.forEach
。这只是编写 Array.prototype.forEach.call
的简写。
如果您想象调用是如何“调用”该函数的,那就更容易了,所以想象一下调用函数是这样做的(实际上不是这样的):
return this(arg1, arg2, etc);
现在假设 bind
返回调用函数,将 this
绑定(bind)到 Array.prototype.forEach.call
:
return Array.prototype.forEach.call(arg1, arg2, etc);
您当然可以自己做同样的事情:
var forEach = function(array, fn) {
return Array.prototype.forEach.call(array, fn);
}
虽然我不确定哪一个会更好,但性能方面。
关于javascript - 为什么我不能 var a = someFn.call; A();?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32893367/
我是一名优秀的程序员,十分优秀!