2013-05-24 2 views
4

Я не понимаю разницы между способами объявления функций в jQuery, и несколько раз я терял время, пытаясь вызвать функцию, и она не работает должным образом, потому что она не существует в контекст. Я даже не знаю, являются ли это разными способами объявления функций в jQuery или есть другой способ. Может ли кто-нибудь здесь объяснить мне? Я абсолютно нуб.Способы декларирования функций в jQuery

$(function() { 
     // Your code 
    }) 

    jQuery(function($) { 
     // Your code 
    }); 

    function() { 
     // Your code 
    } 
+0

не забудьте '$ .fn.openACSelect = функция() {};', который позволяет определить свои собственные методы JQuery. –

ответ

8
$(function() { }) 

... точно соответствуют ...

$(document).ready(function() { 
}); 

Это запустит функцию момента DOM готов (событие DOMReady).

jQuery(function($) { 
}); 

То же самое. В большинстве настроек, $: = jQuery (только в случае среды NoConflict). Первый параметр замыкания, который вы передаете в jQuery, вернет объект jQuery. Таким образом, эта функция просто перегруппирует $ на jQuery в дополнение к выполнению именно того, что сделал другой.

Третий оператор - это простое объявление функции, которое не имеет ничего общего с jQuery.

2

Третья функция декларации, которая служит ни к чему, как функции, как без имени и не называется, в то время как первые два из них эквивалентны ($ это псевдоним для JQuery) способы задавать JQuery для вызова функции, когда DOM готов. Это также эквивалентно

$(document).ready(function(){ 
}) 

См http://api.jquery.com/ready/

+1

Мне # 3 является анонимное выражение функции (или синтаксическая ошибка) – bfavaretto

+0

Без скобки, чтобы сделать это выражением, и если он не назначен, я считаю, что это бесполезно, он даже не заслуживает имени. –

+0

@bfavaretto: это был бы IETF, если бы он был '(function() {})()'. Как бы то ни было, это просто объявление функции. –

2

Первые два способа вызова функции, являются ярлык $(document).ready() функции. Это означает, что если вы вызываете тему внутри этого $ или jQuery, они будут выполняться так. Обратитесь к http://api.jquery.com/ready/! Третий относится к вызову нормальной функции. Разница между $ или jQuery для конфликтов с другими библиотеками.

+1

Третий не является анонимным вызовом функции. –

0

jQuery не является языком программирования. Это библиотека, написанная на JavaScript для Javascript. Правила объявления функции в JavaScript являются единственными, за которыми вам нужно следовать. jQuery не предоставляет никакого нового способа определения функций.

Они не являются действительным определением функций:

$(function() { 
    // Your code 
}) 

jQuery(function($) { 
    // Your code 
}); 

Это верное определение функции:

function myFavoriteFunction() { 
    // Your code 
} 
3

Помните, что символы в javascript могут быть именами переменных. Таким образом, в источнике JQuery есть что-то похожее на это определение:

var $ = jQuery = windw.jQuery; 

Где все тех те же переменные. Я указываю это, потому что $() и jQuery() - это то же самое.


Это на самом деле ярлык для jQuery.ready(), где переданный аргумент является обратным вызовом, когда документ загрузился в соответствии с jQuery. Когда вы вставляете function(){} в качестве аргумента, вы создаете анонимную функцию, и это то, что выполняется, когда вызывается обратный вызов.

$(function() {//passing anonymous function 
    // Your code 
}) 

Это на самом деле не правильный код, потому что он должен иметь имя. Он будет бросать исключение «SyntaxError: Неожиданный маркер (»

function() { 
    // Your code 
} 
7

NOTICE: This is indeed too long, but I hope someone finds it helpful.

Для начала:.. $ (или jQuery, они, как правило, то же самое) является функцией На ваших первых двух примерах, вы «вызов этой функции, передавая ей ссылку на анонимную функцию. Это ярлык jQuery для добавления переданной функции в качестве« event.ready »event eventener (фактическое имя события DOMContentLoaded в совместимых браузерах).

JavaScript имеет три способа создания функций:

1. Объявление функции

function foo() { 
    // code 
} 

В заявлении, функция всегда должна быть названа. В этом случае имя функции «foo».

2. Функция выражения

Может быть названа или нет. Обычно они анонимны. Они будут считаться недействительными синтаксисом в зависимости от положения, которое они отображаются в коде. Например, это ошибка синтаксиса:

// syntax error 
function() { 
    // code 
} 

Но это не так:

// passing a function expression is fine 
foo(function() { 
    // code 
}); 

Это также справедливо:

// parentheses make it an expression too 
(function() { 
    // code 
}); 

Это тоже:

// the negation operator also makes it be interpreted as an 
// expression, instead of a syntax error 
!function() { 
    // code 
} 

Два предыдущих примера обычно используются для немедленного LY вызова функции:

!function() { 
    alert('invoked') 
}(); 

(function() { 
    alert('invoked') 
}()); 

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

Это с другой стороны, это очень полезно:

// function expressions are fine on the right-hand-side of an assignment 
var fn = function() { 
    // code 
} 

3. С помощью конструктора Function

// This is similar to 'eval' 
// the string you pass will be the body of the function 
var fn = new Function("return true"); 

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

+1

TIL '! Function() {}' –

+1

@TravisJ TIL "TIL" (мне пришлось это сделать). – bfavaretto

+0

Две небольшие поправки: '! Function() {}' и '(function() {})' являются просто декларациями, а первая не служит цели как не исполняемой вообще (вы теряете ссылку в момент ее создания из-за унарного оператора). '! (function() {})()' приятно. Fiddle: http://tinker.io/57c3d/1 –

1

В JavaScript вы можете передавать функции другим функциям. Когда вы видите что-то вроде

$('div').click(function() { 
    alert("clicked"); 
}); 

вы передаете анонимную функцию в качестве аргумента click() метода, который просто выполняет функцию, которую вы даете ему.

Таким образом, вы могли бы достичь того же результата с

function runOnClick() { alert("clicked"); } 

$('div').click(runOnClick); 
Смежные вопросы