明确的使用方法;这";在JavaScript中
我开始用JavaScript定义类,我对关键字明确的使用方法;这";在JavaScript中,javascript,javascript-objects,Javascript,Javascript Objects,我开始用JavaScript定义类,我对关键字this有很多麻烦 下面是我想做的一个例子: function MyMap() { this.map = new google.maps.Map(....); google.maps.event.addListener(this.map, 'idle', function() { this.mapIdle(); // PROBLEM: "this" undefined }); this.ma
this
有很多麻烦
下面是我想做的一个例子:
function MyMap() {
this.map = new google.maps.Map(....);
google.maps.event.addListener(this.map, 'idle', function() {
this.mapIdle(); // PROBLEM: "this" undefined
});
this.mapIdle = function() {
google.maps.event.addListener(marker, 'click', function() {
$("button").click(function() {
$.ajax({
success: function() {
this.map.clearInfoWindows(); // PROBLEM: "this" undefined
}
});
});
});
}
}
正如您在注释中看到的,这个
在这里不起作用,因为它是在闭包中使用的
我已经开始使用类似于:
甚至是在你不得不绕过你的回调函数的地方(说真的!!)
这是非常丑陋的,而且不适用于任何地方。当我得到很多嵌套的lambda函数(如我给出的示例中所示)时,我不知道如何使用class属性
做这件事的最佳和最正确的方法是什么?如果使用jQuery,
$
如果使用jQuery,$.proxy
非常方便:
您只需将对象和函数分配给局部变量,然后它们就包含在回调函数的闭包中:
function MyMap() {
var map = new google.maps.Map(....);
var mapIdle = function() {
google.maps.event.addListener(marker, 'click', function() {
$("button").click(function() {
$.ajax({
success: function() {
map.clearInfoWindows();
}
});
});
});
};
this.map = map;
this.mapIdle = mapIdle; // Is this needed?
google.maps.event.addListener(this.map, 'idle', function() {
mapIdle();
});
}
MyMap.prototype.myMethod = function() {
var self = this;
// use self in nested functions
};
您只需将对象和函数分配给局部变量,然后它们就包含在回调函数的闭包中:
function MyMap() {
var map = new google.maps.Map(....);
var mapIdle = function() {
google.maps.event.addListener(marker, 'click', function() {
$("button").click(function() {
$.ajax({
success: function() {
map.clearInfoWindows();
}
});
});
});
};
this.map = map;
this.mapIdle = mapIdle; // Is this needed?
google.maps.event.addListener(this.map, 'idle', function() {
mapIdle();
});
}
MyMap.prototype.myMethod = function() {
var self = this;
// use self in nested functions
};
最简单的方法是定义一个self
变量(或者即,如果您不介意非语义变量名),正如您已经提到的:
function MyMap() {
var self = this;
// in nested functions use self for the current instance of MyMap
}
注意,对于添加到原型中的方法(如果它们使用嵌套函数),必须再次执行此操作:
您还应该仔细阅读,注意它不适用于IE,最简单的方法是定义一个self
变量(或者,如果您不介意非语义变量名称的话),如您所述:
function MyMap() {
var self = this;
// in nested functions use self for the current instance of MyMap
}
注意,对于添加到原型中的方法(如果它们使用嵌套函数),必须再次执行此操作:
您还应该仔细阅读,注意它不适用于JavaScript中的IE,此
会在每个函数调用中重新分配
这只是JavaScript中必须注意的一点。一开始可能会让人困惑,但一旦你知道了一些简单的规则,它实际上就相当简单了
如果它是一个类似于myObj.doSomething()
的方法调用,那么此
将自动设置为myObj
内部的doSomething()
如果在进行函数调用时要显式控制this
的值,可以使用doSomething.apply()
或doSomething.call()
来控制函数内部设置的this
值。这就是事件处理程序回调所做的。他们显式地设置this
指向创建事件的对象(这是非常有用的)。您可以阅读有关MDN的更多信息
如果只调用常规函数,则此
将设置为全局对象,该对象在浏览器中是窗口
对象
所有回调函数的this
值都会被弄乱,因为每个函数调用都会更改this
。由于您的事件处理程序是回调函数,而成功处理程序是Ajax函数中的回调函数,因此您应该预期,this
的值不会从周围的代码中保留。有使用代理或绑定函数的变通方法,但通常在闭包中捕获this
的前一个值同样容易,只需使用类似var self=this的东西从那里访问它代码>
在您的环境中,当您希望从事件处理程序外部访问这个指针时,正确的做法是将其保存到一个局部变量中,您将可以在事件处理程序中,甚至在事件处理程序中的Ajax调用中访问该局部变量。没有比这更干净的方法了。通过这种方式,您可以访问来自事件或Ajax调用的This
指针,以及来自调用对象的This
指针,如下所示:
var self = this;
self.mapIdle = function() {
google.maps.event.addListener(marker, 'click', function() {
$("button").click(function() {
$.ajax({
success: function() {
self.map.clearInfoWindows(); // PROBLEM: "this" undefined
}
});
});
});
}
}
在JavaScript中,这个
在每次函数调用时都被重新分配
这只是JavaScript中必须注意的一点。一开始可能会让人困惑,但一旦你知道了一些简单的规则,它实际上就相当简单了
如果它是一个类似于myObj.doSomething()
的方法调用,那么此
将自动设置为myObj
内部的doSomething()
如果在进行函数调用时要显式控制this
的值,可以使用doSomething.apply()
或doSomething.call()
来控制函数内部设置的this
值。这就是事件处理程序回调所做的。他们显式地设置this
指向创建事件的对象(这是非常有用的)。您可以阅读有关MDN的更多信息
如果只调用常规函数,则此
将设置为全局对象,该对象在浏览器中是窗口
对象
所有回调函数的this
值都会被弄乱,因为每个函数调用都会更改this
。由于您的事件处理程序是回调函数,而成功处理程序是Ajax函数中的回调函数,因此您应该预期,this
的值不会从周围的代码中保留。有使用代理或绑定函数的变通方法,但通常在闭包中捕获this
的前一个值同样容易,只需使用类似var self=this的东西从那里访问它代码>
在您的环境中,当您希望从事件处理程序外部访问这个指针时,正确的做法是将其保存到一个局部变量中,您将可以在事件处理程序中,甚至在事件处理程序中的Ajax调用中访问该局部变量。没有比这更干净的方法了。通过这种方式,您可以访问事件或Ajax调用中的This
指针和调用对象中的This
指针,如下所示