以下是两个代码示例。第一个不起作用,第二个起作用,尽管我完全不知道为什么。有人可以解释一下吗?
[我正在编写一个简单的游戏,使用一些jQuery在webkit浏览器中播放(稍后与Titanium一起打包)。]
在第一个例子中,Firebug告诉我“this.checkCloud”不是一个函数。
function Cloud(){
this.checkCloud = function(){
alert('test');
}
$("#"+this.cloudName).click(function(){
this.checkCloud();
});
}
......但是这样可行:
function Cloud(){
this.checkCloud = function(){
alert('test');
}
var _this = this;
$("#"+this.cloudName).click(function(){
_this.checkCloud();
});
}
这个很完美。
为什么第一个不起作用?是因为“this.checkCloud”在匿名函数内部吗?
答案 0 :(得分:2)
这是因为每次通过函数创建新范围时this
的含义都可能发生变化。 this
的含义取决于函数的调用方式(规则可能非常复杂)。正如您所发现的,简单的解决方案是创建第二个变量,将this
保存在this
具有预期/期望值的范围内,然后重用该变量而不是this
在this
可能不同的新函数范围中引用相同的对象。
答案 1 :(得分:2)
:
$("#"+this.cloudName).click(function(){
this.checkCloud();
});
this
引用所选元素(jquery对象)。
你可以做的是使用私人功能
var checkCloud = function(){
alert('test');
}
这样你只需在你的匿名函数中调用它
$("#"+this.cloudName).click(function(){
checkCloud();
});
答案 2 :(得分:1)
试试这个:
function Cloud(){
this.checkCloud = function(){
alert('test');
}
var func = this.checkCloud;
$("#" + this.cloudName).click(function(){
func();
});
}
答案 3 :(得分:0)
当您为元素分配偶数侦听器时,jQuery会确保this
将引用该元素。但是当你创建_this
变量时,你正在创建一个jQuery无法解决的闭包,即使它想要。