jQuery函数实现和函数调用?

时间:2010-04-16 16:24:55

标签: javascript jquery

调用函数有什么区别,如:

jQuery中的

testCall: function()function testCall()

更新

问题: 对一个人的使用是否存在与之相关的一些性能问题OR你正在使用哪一个并不重要?< / p>

更新2

我还注意到其他一些事情,当我使用testCall: function()定义函数并使用this.testCall()调用它时,它工作正常,并且可以在任何其他函数中调用它。

但是当我使用function testCall()时,我试图在另一个函数中使用testCall()来调用它,而不是我收到错误而无法调用它。这是可能的还是errors可能还有其他原因?

3 个答案:

答案 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中的更多内容。)