Javascript jQuery函数实现和函数调用?
调用函数的区别是什么:Javascript jQuery函数实现和函数调用?,javascript,jquery,Javascript,Jquery,调用函数的区别是什么: testCall:jQuery中的function()和function testCall() 更新: 问题:使用一个而不是另一个是否存在一些与之相关的性能问题或使用哪一个并不重要 更新2 我还注意到,当我使用testCall:function()定义函数并使用this.testCall()调用它时,它工作正常,可以在任何其他函数中调用它 但是,当我在另一个函数中使用函数testCall()并尝试使用testCall()调用它时,我会遇到错误,无法调用它。这是可能的,还是
testCall:jQuery中的function()
和function testCall()
更新:
问题:使用一个而不是另一个是否存在一些与之相关的性能问题或使用哪一个并不重要
更新2
我还注意到,当我使用testCall:function()
定义函数并使用this.testCall()
调用它时,它工作正常,可以在任何其他函数中调用它
但是,当我在另一个函数中使用函数testCall()
并尝试使用testCall()
调用它时,我会遇到错误,无法调用它。这是可能的,还是有其他原因导致错误
?在本例中:
testCall: function()
testCall
现在是您所在对象上可用的函数,如下所示:object.testCall()
如果需要,它可以访问此对象内的其他函数、属性等
在此版本中:
function testCall()
testCall
只是一个全局可用的方法,不局限于对象或插件,无论你在处理什么,你都可以从任何地方调用它,就像这样:testCall()
这实际上是一个关于Javascript语法(和语义)的问题,而不是jQuery
这两种结构都定义了函数。这:
var x = {
// ...
name: function() { /* ... */ },
// ...
};
定义一个函数(一个匿名函数),并将其指定为被指定给变量“x”的对象中名为“name”的属性的值
这:
定义一个名为“name”的函数。其效果类似于:
var name = function() { /* ... */ };
但肯定不同。然而,在大多数情况下,可以安全地认为它们几乎是一样的。其效果是“name”绑定到词汇封闭范围内的函数。如果在任何其他函数之外进行该定义,则“name”将成为“window”对象的属性,因此该函数是全局可用的。如果该声明位于另一个函数内,则“name”仅在该函数内可用
通常,当您在为一些jQuery工具(如UI插件或$.ajax
)设置回调时,您会看到第一个表单。您正在为jQuery提供一个函数,它应该在发生某些事情时调用该函数——AJAX调用finishing,或者使用鼠标单击之类的操作,或者完成某种动画
编辑哦,最后是另一个注释。如果以第二种方式定义函数,那么可以按名称引用该函数,并在对象定义中使用它(如第一个示例):
还有很多类似的事情是可能的——函数是Javascript中的值,可以像数字和字符串一样轻松地进行转换。第一个(testCall:function()
)是用于定义函数并将其分配给对象(未显示)上的属性的对象文字符号。函数本身是匿名的;绑定到的属性有名称,但函数没有名称
第二个(函数testCall()
)是一个命名函数
与匿名函数相比,命名函数有几个优点,因此尽管您经常看到第一种格式,但我建议您尽量少用它。您的工具(调试器等)可以有效地报告命名函数,而匿名函数只显示为?
或(匿名)
出于这个原因,而不是这个原因:
function doSomeNiftyAjaxyThing(foo) {
$.ajax({
url: "blah",
success: function() {
// Do something involving the successful result and `foo`
foo.bar();
}
});
}
我通常会这样做:
function doSomeNiftyAjaxyThing(foo) {
$.ajax({
url: "blah",
success: niftySuccess
});
function niftySuccess() {
// Do something involving the successful result and `foo`
foo.bar();
}
}
这不仅使我的代码更干净(呃,在我看来),而且意味着如果niftysecess
内部出现问题,我已经给函数起了一个名字,我的工具可以向我报告。请注意,除了函数有一个名称之外,它们是相同的–两个函数都是foo
参数上的闭包,以及doSomeNiftyAjaxyThing
中的任何其他函数
您可能会尝试以内联方式为函数命名,如下所示:
function doSomeNiftyAjaxyThing(foo) {
$.ajax({
url: "blah",
success: function niftySuccess() { // <== change here, PROBLEMATIC
// Do something involving the successful result and `foo`
foo.bar();
}
});
}
函数doSomeNiftyAjaxyThing(foo){
$.ajax({
网址:“废话”,
success:function niftySuccess(){//您能提供一些示例吗?第一个类似于json
语法,最后一个只是函数定义的常规语法。它类似于json语法,但请注意不能在json中包含函数。@Crozin:它是对象文字符号(json是其子集)@SO读者:我要感谢你们所有人继续提供指导。
function doSomeNiftyAjaxyThing(foo) {
$.ajax({
url: "blah",
success: niftySuccess
});
function niftySuccess() {
// Do something involving the successful result and `foo`
foo.bar();
}
}
function doSomeNiftyAjaxyThing(foo) {
$.ajax({
url: "blah",
success: function niftySuccess() { // <== change here, PROBLEMATIC
// Do something involving the successful result and `foo`
foo.bar();
}
});
}