每次嵌套函数时,你都必须考虑this
。但是如果你不嵌套函数,或者该函数不使用this
你不需要考虑它。
init: function () {
var self = this;
self.getAjaxVar();
},
所以在这种情况下没有必要。这是完全相同的:
init: function () {
this.getAjaxVar();
},
但在这儿:
getAjaxVar: function() {
var self = this;
$.get('ajax/test.html', function(response) {
self.someVarToBeSetUsingAjax = response.value;
});
},
您创建了一个内部函数,并且需要对原始值的引用this
,所以你必须别名this
to self
使其易于访问。
没有办法修复this
班级各处的价值观。
也就是说,你确实有一些选择。
Function.prototype.bind()
可以帮助。
var func = function() { return this.name };
var obj = { name: 'Bob' };
var boundFunc = func.bind(obj);
boundFunc(); // 'Bob'
bind
将返回一个新函数this
始终设置为特定对象。
So:
getAjaxVar: function() {
$.get('ajax/test.html', function(response) {
this.someVarToBeSetUsingAjax = response.value;
}.bind(this));
},
请注意,并非所有浏览器都支持此功能,您可能需要旧浏览器的填充程序。
或者只是习惯self = this
.
我也想对 CoffeeScript 表示一点点的认可,因为它支持在运行时不改变上下文的函数声明。
obj = {
name: "bob"
sayHello: ->
doSomeAjax({
success: =>
alert "successfully made " + this.name + " say hello!"
})
}
obj.sayHello()
->
使功能正常。但粗箭头=>
相反,将保留this
函数内部和函数外部。它在实例方法中的回调中非常方便。当编译为 JS 时,它基本上做了一个self = this
您的别名,使用self
每次在内部函数内引用this
。它非常光滑。
但在普通 JS 中,最常见的模式就是self = this
, 坚持下去。