使用Function.prototype.apply设置javascript回调范围

inc*_*ist 9 javascript scope apply

每次我在JavaScript中声明一个回调时,必须手动设置对象的范围是令人沮丧的,但这是生活中的事实.我想知道我是否可以通过传递[mycallback] .apply作为回调,并将范围对象作为参数来实现,如下所示:

var f = function() { console.log(this.x); };
var o = {x: 3};
setTimeout(f.apply, 1000, o);
Run Code Online (Sandbox Code Playgroud)

据我所知,这应该用o作为范围调用f,但是Chrome给了我"未捕获的TypeError:Function.prototype.apply在[object DOMWindow]上被调用,它是一个对象,而不是一个函数".为什么这不起作用?

Moo*_*Goo 5

出于同样的原因,您需要首先"设置范围".仅apply发送函数setTimeout,其与函数的关联f丢失.因此,Javascript将全局对象分配windowthis,就像在任何其他情况下一样.

有趣的是apply,作为本机函数,在某种程度上并不特殊或神奇,并且在this变量设置中以与用户定义函数一致的方式运行.