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)
但是,我不知道为什么这个修好了.我不知道是什么语言机制导致了这种行为.
你想要的是这个:
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)
这解决了问题,因为您在调用它时将调用对象更改回原始对象。
return win.setTimeout(arg1, arg2);
Run Code Online (Sandbox Code Playgroud)
会将上下文(或 this )设置回窗口应有的位置。其他答案是相似的,因为它们使用bindto将上下文更改为正确的值apply。
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |