如何正确执行函数引用(1)?

nat*_*ing 5 javascript

win指向window. NS是这篇文章的临时命名空间.我想如果我想访问setTimeout,我可以复制函数引用:

NS.setTimeout = win.setTimeout;
Run Code Online (Sandbox Code Playgroud)

但是,执行会抛出错误:

NS_ERROR_XPC_BAD_OP_ON_WN_PROTO: Illegal operation on WrappedNative prototype object @ ...
Run Code Online (Sandbox Code Playgroud)

为了解决这个错误,我刚刚做了:

NS.setTimeout = function (arg1, arg2) {
    return win.setTimeout(arg1, arg2);
};
Run Code Online (Sandbox Code Playgroud)

但是,我不知道为什么这个修好了.我不知道是什么语言机制导致了这种行为.

Den*_*ret 8

你想要的是这个:

NS.setTimeout = win.setTimeout.bind(win);
Run Code Online (Sandbox Code Playgroud)

或者你已经做了什么,如果你想与IE8兼容.

因为setTimeout,像许多window函数一样,需要receiver(this)window.

另一个IE8兼容的解决方案,在我看来比你的更优雅(因为它不使用你知道需要的参数数量的事实setTimeout),将是

NS.setTimeout = function(){
  return win.setTimeout.apply(win, arguments);
};
Run Code Online (Sandbox Code Playgroud)


ple*_*unt 0

这解决了问题,因为您在调用它时将调用对象更改回原始对象。

return win.setTimeout(arg1, arg2);
Run Code Online (Sandbox Code Playgroud)

会将上下文(或 this )设置回窗口应有的位置。其他答案是相似的,因为它们使用bindto将上下文更改为正确的值apply