Синтаксис функции JavaScript - PullRequest
1 голос
/ 14 января 2010

В своей слабой попытке выучить JavaScript я купил книгу, которая научит вас, как делать что-то на JavaScript, но забудет упомянуть ПОЧЕМУ.

Исходя из PHP, я знаком с типичным синтаксисом функции:

function name() {return;}

который, как я понимаю, работает в JS так же.

Затем я решил, что хочу попытаться использовать инфраструктуру YUI 3 для небольшого проекта, чтобы продолжить обучение и натолкнуться на это ... Глобальный объект YUI

YUI().use('node', function(Y) {
   Y.Node.get('#demo');
});

Насколько я понимаю, это использует функцию 'use' объекта YUI (), передавая 'node' в функцию 'use' .... но что потом ... почему она объявляет функцию внутри вызов другой функции?

Может кто-нибудь объяснить, какой синтаксис здесь используется?

Также было бы полезно получить хороший справочник, объясняющий общий синтаксис JavaScript, аналогичный php.net. Спасибо за вашу помощь.

Ответы [ 6 ]

5 голосов
/ 14 января 2010

Это анонимная функция. Это считается обратным вызовом.

В PHP 4 и более ранних версиях PHP 5 вы можете увидеть что-то вроде этого:

PHP

function callback($var){
   ...
}

array_filter( $array, "callback" );

В более поздних версиях PHP 5 вы можете определить их как встроенные анонимные функции.

Итак, в JavaScript старая версия будет выглядеть так:

JavaScript

function use_callback(Y){
    Y.Node.get('#demo');
}

YUI().use('node', use_callback);

Но, определив встроенную анонимную функцию, вы можете сохранить дополнительный беспорядок и определенную функцию:

YUI().use('node', function(Y) {
   Y.Node.get('#demo');
});

Обе эти функции эквивалентны.

2 голосов
/ 14 января 2010

В javascript функции могут передаваться как переменные. Итак, вот несколько других способов, которыми код YUI мог быть написан

//original
YUI().use('node', function(Y) {
   Y.Node.get('#demo');
});


//more traditional "global function" 
function useNode(Y) {
    Y.Node.get('#demo');
}
YUI().use('node', useNode);


//local callback function
var myUseNode = function(Y) {
    Y.Node.get('#demo');
}
YUI().use('node', myUseNode);

edit Что касается второй половины вашего вопроса, вы можете написать то, что я знаю о PHP, на почтовой марке, поэтому я не могу вам помочь, извините: -)

2 голосов
/ 14 января 2010

Это создание анонимной функции, а затем передача самой функции в качестве аргумента use. Затем метод use вызовет вашу анонимную функцию со значением, которое в вашей функции будет называться Y, которое содержит модули, которые вы запрашивали в предыдущих аргументах для use.

Это по существу эквивалентно следующему, который передает myFunction в качестве обратного вызова к YUI().use, за исключением того, что анонимная функция не имеет имени:

function myFunction(Y) {
   Y.Node.get('#demo');
}

YUI().use('node', myFunction);

Этот шаблон используется, потому что в JavaScript нет явного представления о пространствах имен или модулях. Однако их можно эмулировать, используя область действия функции как своего рода пространство имен. В этом случае YUI().use создаст объект, который обладает всеми функциями, которые вы запрашиваете, и передаст этот объект в предоставляемую вами функцию, поэтому вы можете использовать этот объект Y для вызова импортированных вами методов.

Для хорошего онлайн-справочника по синтаксису и методам JavaScript я хотел бы использовать документацию Mozilla Developer Center . В частности, у них есть хорошие ссылки на JavaScript и DOM . Поскольку это часть проекта Mozilla, они сосредоточены на методах и синтаксисе, поддерживаемых Gecko (движком рендеринга Firefox), но обычно они содержат примечания по совместимости, в которых упоминается, что является переносимым, а что специфичным для Gecko.

На ваш вопрос я бы рекомендовал прочитать документацию MDC по функциям и области действия . К сожалению, MDC обычно не занимает первое место в поиске Google; вместо этого вы получаете W3Schools, который имеет низкое качество и имеет больше рекламы. Я считаю полезным всегда ставить перед поиском что-нибудь о JavaScript или DOM с помощью mdc, чтобы получить документацию по MDC; так, например, чтобы найти эту ссылку, я искал функцию mdc и нашел то, что мне нужно.

2 голосов
/ 14 января 2010

В JavaScript функции - это объекты. В этом случае они передают объект как значение второго параметра (и определяют его как встроенный).

YUI().use('node', function(Y) {
    Y.Node.get('#demo');
});

такой же, как этот:

var xxx = function(Y) {
    Y.Node.get('#demo');
};

YUI().use('node', xxx);
0 голосов
/ 14 января 2010

Показано то, что известно как анонимная функция, которая передается в качестве аргумента функции. Я не думаю, что в PHP есть первоклассные функции, подобные этой, поэтому я понятия не имею, как объяснить синтаксис в терминах этого (я тоже мало что делаю с PHP, так что ..)

Вот мой пример кода:

function something_random(a) {
    alert("the type of a is ... " + typeof(a));
    if (typeof(a) === 'function') {
        a();
    }
}

Теперь, имея в виду эту функцию, вы можете подключить ее к Firebug или что-то подобное и запустить следующий код:

something_random(function () {
    alert("This is a test.");
});

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

Вы можете разбрасывать функции весь день, если хотите - они похожи на числа, массивы и так далее.

Нечто интересное также может случиться. Вы также можете передавать аргументы в анонимные функции, что jQuery делает довольно редко (за исключением того, что он использует call, но мы не будем туда идти). Здесь вы получаете специальные вещи, например, куда вы помещаете function(d) {} в коде.

Надеюсь, это поможет.

0 голосов
/ 14 января 2010

Это объявление анонимной функции (сродни лямбда-функции ).

YUI().use('node', function(Y) {
   Y.Node.get('#demo');
})

В Javascript функции - это граждане 1-го класса - они такие же объекты, как и все остальные; следовательно, они могут быть переданы в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...