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

时间:2013-07-25 13:45:37

标签: javascript

win指向windowNS是此帖子的临时命名空间。我想如果我想访问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);
};

但是,我不知道为什么要修复它。我不知道造成这种行为的语言机制是什么。

3 个答案:

答案 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);

会将上下文(或这个)设置回窗口所在的位置。其他答案类似,因为他们使用bindapply将上下文更改为正确的值。