Javascript “为什么?”;这个.myFunction“;在对象内部调用函数时不起作用?
下面是两个代码示例。第一个坏了,第二个坏了,尽管我完全不知道为什么。有人能解释一下吗 [我正在编写一个简单的游戏,使用一点jQuery在webkit浏览器中玩(稍后用Tianium打包)。] 在第一个例子中,Firebug告诉我“this.checkCloud”不是一个函数Javascript “为什么?”;这个.myFunction“;在对象内部调用函数时不起作用?,javascript,oop,this,Javascript,Oop,This,下面是两个代码示例。第一个坏了,第二个坏了,尽管我完全不知道为什么。有人能解释一下吗 [我正在编写一个简单的游戏,使用一点jQuery在webkit浏览器中玩(稍后用Tianium打包)。] 在第一个例子中,Firebug告诉我“this.checkCloud”不是一个函数 function Cloud(){ this.checkCloud = function(){ alert('test'); } $("#"+this.clou
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”在匿名函数中吗?当您将偶数侦听器分配给元素时,jQuery确保
此
将引用该元素。但是,当您创建\u这个
变量时,您正在创建一个jQuery无法处理的闭包,即使它想处理。当您为一个元素分配一个偶数侦听器时,jQuery确保这个
将引用该元素。但是,当您创建\u this
变量时,您正在创建一个jQuery无法处理的闭包,即使它想处理。这是因为每当您通过函数创建一个新范围时,this
的含义可能会发生变化。此
的含义取决于函数的调用方式(规则可能非常复杂)。正如您所发现的,简单的解决方案是创建第二个变量,将this
保存在this
具有预期/期望值的范围内,然后重用变量而不是this
,以引用新函数作用域中的同一对象,其中this
可能不同。这是因为每次通过函数创建新作用域时,this
的含义可能会发生变化。此
的含义取决于函数的调用方式(规则可能非常复杂)。正如您所发现的,简单的解决方案是创建第二个变量,将this
保存在this
具有预期/期望值的范围内,然后重用变量而不是this
,以引用新函数范围中的相同对象,其中this
可能不同。在本例中:
$("#"+this.cloudName).click(function(){
this.checkCloud();
});
此
引用所选元素(jquery对象)
你能做的就是使用私有函数
var checkCloud = function(){
alert('test');
}
通过这种方式,您只需在匿名函数中调用它
$("#"+this.cloudName).click(function(){
checkCloud();
});
在本例中:
$("#"+this.cloudName).click(function(){
this.checkCloud();
});
此
引用所选元素(jquery对象)
你能做的就是使用私有函数
var checkCloud = function(){
alert('test');
}
通过这种方式,您只需在匿名函数中调用它
$("#"+this.cloudName).click(function(){
checkCloud();
});
试试这个:
function Cloud(){
this.checkCloud = function(){
alert('test');
}
var func = this.checkCloud;
$("#" + this.cloudName).click(function(){
func();
});
}
试试这个:
function Cloud(){
this.checkCloud = function(){
alert('test');
}
var func = this.checkCloud;
$("#" + this.cloudName).click(function(){
func();
});
}
特别是与jQuery无关,而与JavaScript无关。@Michael:jQuery手动设置
this
的值以引用调用处理程序的元素。如果未将Cloud()
作为构造函数调用,并且我们使内部函数只是一个典型的命名函数,并调用了它,那么代码将正常工作,因为这两个函数中的都将引用窗口
(除非您处于严格模式)。示例:与jQuery无关,而与JavaScript无关。@Michael:jQuery手动设置this
的值以引用调用处理程序的元素。如果未将Cloud()
作为构造函数调用,并且我们使内部函数只是一个典型的命名函数,并调用了它,那么代码将正常工作,因为这两个函数中的都将引用窗口
(除非您处于严格模式)。示例:“this
t表示封闭范围…this
在最里面的函数中指的是最里面的函数”虽然它可能(也可能不)随每个函数而改变,但它不指封闭范围,也不指函数本身(除非您已经这样做)。我们不知道如何调用Cloud()
,所以我们不知道该函数中的是什么。@patrick,说得好。我添加了一些关于它的附加信息。我意识到这可能仍然不是100%正确,但这是一种很有用的思考方式。是的,这在javascript中是一个很奇怪的主题。至少有六个不同的事情需要考虑,这可能会改变<代码>这个<代码>值。谢谢理解,但是在思考了一些之后,我的解释很不好。使其更准确。“此
t指封闭范围…此
在最里面的函数中指最里面的函数”虽然它可能(也可能不)随每个函数而改变,但它不指封闭范围,也不指函数本身(除非您已经这样做)。我们不知道如何调用Cloud()
,所以我们不知道该函数中的是什么。@patrick,说得好。我添加了一些关于它的附加信息。我意识到这可能仍然不是100%正确,但这是一种很有用的思考方式。是的,这在javascript中是一个很奇怪的主题。至少有六个不同的事情需要考虑,这可能会改变<代码>这个<代码>值。谢谢理解,但是在思考了一些之后,我的解释很不好。所以在JavaScript中,如果在函数中使用“var”,就如同将某些东西设置为私有。这是有道理的。所以在JavaScript中,如果函数中的某个东西是私有的,那么执行“var”就像是私有的。这是有道理的。