使用实例方法作为事件处理程序的回调将范围this从 “My instance” 更改为 “Whatever just called the callback” 。所以我的代码看起来像这样
this
function MyObject() { this.doSomething = function() { ... } var self = this $('#foobar').bind('click', function(){ self.doSomethng() // this.doSomething() would not work here }) }
它有效,但这是最好的方法吗?我觉得很奇怪。
这个问题不是特定于 jQuery,而是一般特定于 JavaScript。核心问题是如何在嵌入式函数中“引导”变量。这是一个例子:
var abc = 1; // we want to use this variable in embedded functions function xyz(){ console.log(abc); // it is available here! function qwe(){ console.log(abc); // it is available here too! } ... };
这种技术依赖于使用闭包。但它不起作用,this因为this它是一个伪变量,可以动态地从范围更改为范围:
// we want to use "this" variable in embedded functions function xyz(){ // "this" is different here! console.log(this); // not what we wanted! function qwe(){ // "this" is different here too! console.log(this); // not what we wanted! } ... };
我们能做什么?将其分配给某个变量并通过别名使用它:
var abc = this; // we want to use this variable in embedded functions function xyz(){ // "this" is different here! --- but we don't care! console.log(abc); // now it is the right object! function qwe(){ // "this" is different here too! --- but we don't care! console.log(abc); // it is the right object here too! } ... };
this在这方面不是唯一的:arguments是另一个应该以相同方式处理的伪变量——通过别名。
arguments