win
指向window
。 NS
是此帖子的临时命名空间。我想如果我想访问setTimeout
,我可以复制函数引用:
NS.setTimeout = win.setTimeout;
但是,执行会抛出错误:
NS_ERROR_XPC_BAD_OP_ON_WN_PROTO: Illegal operation on WrappedNative prototype object @ ...
要解决此错误,我刚刚做了:
NS.setTimeout = function (arg1, arg2) {
return win.setTimeout(arg1, arg2);
};
但是,我不知道为什么要修复它。我不知道造成这种行为的语言机制是什么。
答案 0 :(得分:8)
你想要的是这个:
NS.setTimeout = win.setTimeout.bind(win);
或者你已经做了什么,如果你想与IE8兼容。
因为setTimeout
与许多window
函数一样,需要接收者(this
)为window
。
另一个IE8兼容的解决方案,在我看来比你的更优雅(因为它没有使用你知道setTimeout
所需的参数数量的事实),
NS.setTimeout = function(){
return win.setTimeout.apply(win, arguments);
};
答案 1 :(得分:4)
你不能这样做的原因是,在指定时,你正在改变setTimeout
的调用上下文,这是不允许的。
它也不允许setInterval
和许多其他本机对象/函数。再说一遍:一个很好的经验法则:如果你不拥有对象,请不要触摸它。由于函数是JS中的对象,因此该规则也适用于它们
check the specs on the global object及其属性/内置函数:
每当ECMAScript程序开始执行时,都会有某些内置对象可用。一个是全局对象,是执行程序的词汇环境的一部分。其他可以作为全局对象的初始属性访问。
等等。但the lexical environment非常重要。通过在其他地方分配对函数的引用,您可能会掩盖词汇环境的一部分,或者暴露太多的全局环境(例如mashup)。
答案 2 :(得分:0)
这解决了问题b.c.您在调用它时将调用对象更改回原始对象。
return win.setTimeout(arg1, arg2);
会将上下文(或这个)设置回窗口所在的位置。其他答案类似,因为他们使用bind
到apply
将上下文更改为正确的值。