【发布时间】:2011-07-22 13:51:50
【问题描述】:
每次我在 JavaScript 中声明回调时都必须手动设置对象的范围,这很令人沮丧,但这是不争的事实。我想知道是否可以通过将 [mycallback].apply 作为回调传递,并将范围对象作为参数传递来做到这一点,如下所示:
var f = function() { console.log(this.x); };
var o = {x: 3};
setTimeout(f.apply, 1000, o);
据我所知,这应该以 o 为范围调用 f,但 Chrome 却给了我“未捕获的类型错误:在 [object DOMWindow] 上调用了 Function.prototype.apply,这是一个对象而不是函数”。为什么这不起作用?
【问题讨论】:
-
到底是谁用反对票轰炸了我们所有的答案?
-
@Travis - 我认为你的回答很好;它只是没有抓住重点。 @MooGoo 的回答实际上说明了与
f的关联丢失了,这是最好的答案。 -
任何怀疑你可以将原生函数作为参数传递给其他函数的人都应该试试这个:
Function.prototype.apply.apply.call(Function.prototype.apply, function(t) { alert(t) }, [this, ["test"]]); -
@lwburk 是的,你是对的。我寻求解决方案,而不是“为什么”
-
您可能想要
f.bind(o)(并非在所有浏览器中都可用)。
标签: javascript scope apply