调用函数有什么区别,如:
jQuery中的 testCall: function()
和function testCall()
更新
问题: 对一个人的使用是否存在与之相关的一些性能问题OR
你正在使用哪一个并不重要?< / p>
更新2
我还注意到其他一些事情,当我使用testCall: function()
定义函数并使用this.testCall()
调用它时,它工作正常,并且可以在任何其他函数中调用它。
但是当我使用function testCall()
时,我试图在另一个函数中使用testCall()
来调用它,而不是我收到错误而无法调用它。这是可能的还是errors
可能还有其他原因?
答案 0 :(得分:2)
在这个例子中:
testCall: function()
testCall
现在是您所在对象的可用函数,如下所示:object.testCall()
如果需要,它可以访问此对象内的其他函数,属性等。
在此版本中:
function testCall()
testCall
只是一个全局可用的方法,没有作用于对象或插件,无论你处理什么,你可以从任何地方调用它,如下所示:testCall()
答案 1 :(得分:2)
这实际上是关于Javascript语法(和语义)的问题,而不是jQuery。
这两个结构都定义了函数。这样:
var x = {
// ...
name: function() { /* ... */ },
// ...
};
定义一个函数(匿名函数),并将其指定为分配给变量“x”的对象中名为“name”的属性的值。
此:
function name() {
/* ... */
}
定义名为“name”的函数。效果类似于:
var name = function() { /* ... */ };
但绝对不同。但是,对于大多数用途来说,将它们视为几乎相同是安全的。结果是“name”绑定到词法封闭范围内的函数。如果在任何其他函数之外执行该定义,则“name”将成为“window”对象的属性,因此该函数是全局可用的。如果该声明是 in 另一个函数,则“name”仅在该函数内可用。
通常你会在为某些jQuery工具设置回调时看到第一个表单,比如UI插件或$.ajax
。你给jQuery一个函数,它应该调用发生的事情 - 一个AJAX调用完成,或像鼠标点击一样的使用动作,或完成某种动画。
编辑哦,最后这是另一个说明。如果您以第二种方式定义函数,那么您可以按名称引用该函数并在对象定义中使用它(如第一个示例):
function globalFunction() {
function localFunction() { /* ... */ };
jQuery.something({
x: 100, y: 100,
callback: localFunction,
// ...
});
}
更多这样的事情是可能的 - 函数是Javascript中的值,可以像数字和字符串一样轻松地抛出。
答案 2 :(得分:0)
第一个(testCall: function()
)是对象文字符号,用于定义函数并将其分配给对象(未显示)上的属性。功能本身是匿名的;它绑定的属性有一个名称,但该函数没有。
第二个(function testCall()
)是一个命名函数。
命名函数比匿名函数有几个优点,所以虽然你看到第一个格式相当多,但我建议谨慎使用它。您的工具(调试器等)可以有效地报告命名函数,而匿名函数只显示为?
或(anonymous)
。 More here.
出于这个原因,而不是:
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();
}
}
这不仅使我的代码更清洁(呃,在我的脑海中),但这意味着如果niftySuccess
内部出现问题,我会给函数一个名称,我的工具可以向我报告。请注意,除了函数具有名称的事实之外,它们是相同的 - 两个函数都是foo
参数和doSomeNiftyAjaxyThing
内的任何其他函数的闭包。
您可能想要为函数提供内联名称,如下所示:
function doSomeNiftyAjaxyThing(foo) {
$.ajax({
url: "blah",
success: function niftySuccess() { // <== change here, PROBLEMATIC
// Do something involving the successful result and `foo`
foo.bar();
}
});
}
在那里,您将声明一个名称作为表达式的函数,并将表达式的结果分配给属性。可以说你应该能够做到这一点,但是有一系列的实现...各种Javascript引擎中的异常会阻止你能够做到这一点。 (上面链接的文章以及this article中的更多内容。)