2010-04-16 4 views
2

В чем отличие функции вызова:Выполнение функции jQuery и вызов функции?

testCall: function() и function testCall() в jQuery?

Обновление:

Вопросы: ли использование одного над другим были некоторые проблемы с производительностью, связанные с ним OR это действительно не имеет значения, какой из них вы используете?

Update 2

Также другая вещь, которую я заметил, что я Когда N определения функции с помощью testCall: function() и я называю это с помощью this.testCall() он работает отлично, и я в состоянии назвать его в любой другой функции.

Но когда я использую function testCall(), и я пытаюсь позвонить ему, используя testCall() в другой функции, чем я получаю ошибки и не могу назвать это. Возможно ли это или может быть какая-то другая причина для errors?

+0

Не могли бы вы привести несколько примеров? Первый выглядит как синтаксис 'json', а последний - просто регулярный синтаксис для определения функции. – Crozin

+0

Похоже на синтаксис JSON, но обратите внимание, что в JSON нельзя включать функции. – Pointy

+0

@Crozin: Это объектная буквальная запись (которая JSON является подмножеством). –

ответ

2

В этом примере:

testCall: function() 

testCall теперь функция доступна на объекте вы находитесь, как это: object.testCall() Он может получить доступ к другим функциям, свойствам и т.д. внутри этого объекта, если это необходимо.

В этой версии:

function testCall() 

testCall просто доступный метод глобально, а не области видимости объекта или плагин, что вы имеете дело с, вы можете позвонить из любого места, как это: testCall()

2

Это действительно вопрос о синтаксисе Javascript (и семантике), а не jQuery.

Обе эти конструкции определяют функции. Это:

var x = { 
    // ... 
    name: function() { /* ... */ }, 
    // ... 
}; 

определяет функцию (анонимный функция) и присваивает его в качестве значения свойства под названием «имя» в объекте, присвоенном переменный «х».

Это:

function name() { 
    /* ... */ 
} 

определяет функцию с именем "имя". Эффект похож на:

var name = function() { /* ... */ }; 

но определенно разные. Однако для большинства целей безопасно думать о них как о почти то же самое. Эффект заключается в том, что «имя» привязано к функции в лексически-охватывающей области. Если вы выполняете это определение вне любой другой функции, тогда «имя» становится свойством объекта «window», и поэтому функция доступна по всему миру.Если это объявление внутри другая функция, то «имя» доступно только внутри этой функции.

Обычно вы видите первую форму, когда вы делаете что-то вроде настройки обратных вызовов для некоторого средства jQuery, например, плагина пользовательского интерфейса или $.ajax. Вы даете jQuery функцию, которая должна вызвать что-то происходящее — AJAX-вызов, или действие, подобное щелчку мыши, или завершение какой-либо анимации.

Редактировать О, и, наконец, вот еще одно примечание. Если определить функцию второй путь, а затем вы можете обратиться к этой функции от имени и использовать его в определении объекта (как в первом примере):

function globalFunction() { 
    function localFunction() { /* ... */ }; 

    jQuery.something({ 
    x: 100, y: 100, 
    callback: localFunction, 
    // ... 
    }); 
} 

Многие другие такие вещи возможны - функции значения в Javascript и может быть перемещен так же легко, как цифры и строки.

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.)

Смежные вопросы