Синтаксис. Помогите новичку
Друзья, помогите с синтаксисом. Я сам пересел (вчера) с c# и .net и нужно решить задачу.
1. файл начинается с кода (function(factory) { if(typeof define === 'function' && define.amd) { define(['jquery'], factory); } else { factory(jQuery); } }(function($) {...}) В документации по javascript идет классическое определение функций. А тут скобка, потом еще скобка... где копать? как называется этот синтаксис? сам прочитаю. 2. В верхнем примере в первой функции - что делает этот код? хотя когда получу ответ на первый вопрос, наверное смогу получить ответ сам. Но все равно натолкните - что читать? 3. $.fn.fnname = function(method) { ... var pMethods = { fnname1: function(){} fnname2: function(){}} ... if(methods[method]) { return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); } else if(typeof method === 'object' || !method) { return methods.init.apply(this, arguments); } } я правильно понимаю, что каким то образом в method передается ссылка на метод, и кодом if(methods[method]) { return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); } else if(typeof method === 'object' || !method) { return methods.init.apply(this, arguments); }я выбираю метод из класса mthods (хотя наверно это и не класс вовсе) и передаю в него параметры arguments? Если да, то где найти доки по тому как и что идет за чем? как эти arguments появились? Заранее спасибо. Достаточно просто названий и я докопаюсь) Хочу задачу решить быстрее а документации уж очень много. Нужно навправление. |
На первый вопрос нашел ответ. Это называется Immediately-Invoked Function Expression (IIFE)
|
1. Это анонимная функция-выражение, которая сразу же вызывается.
// вот функция. (function(){ }) // тут же ее вызов с аргументом blabla (blabla) Почему функция берется в скобки: есть два типа функций: функция-выражение, и декларация функции. Скобки просто подсказывают js-интерпретатору что это функция-выражение. Декларация по сути как бревно, должна иметь имя и ее нельзя вызвать незамедлительно. Ее нельзя объявлять, скажем внутри блоков типа if..else и т.п. Смахивает на методы в C#. Функция-выражение не требует имени, может передаваться аргументом. Типа лямбды в C#. Вместо blabla у тебя передается опять же функция-выражение. 2. Результат всех этих манипуляций - переменная factory, ссылающаяся на функцию (ту, что вместо blabla). Далее, если доступна модульная система amd, то регистрируем эту функцию как модуль, иначе тут же вызываем. 3. method - это тупо строка. Допустим в качестве method нам передали строку 'fnname1'. Тогда получаем methods['fnname1'], что тоже самое что и понятное тебе methods.fnname1. Короче чета типа Reflection из C# (слышал мельком). Только тут это называется dynamic lookup и используется повсеместно (хотя по возможности нужно избегать, ибо ломает оптимизации js-движка) Переменная arguments доступна внутри любой функции и содержит аргументы. Array.prototype.slice.call(arguments, 1) - тут получаем массив, содержащий второй и последующие аргументы. Если бы arguments являлся бы инстансом "класса" Array, то можно было бы писать arguments.slice(1). fn.apply(context, [bla, bla]) - почти тоже самое что и fn(bla, bla), только устанавливает нужный контекст (ключевое слово this). This в js - штука необычная, обязательно прочитай про него тут на сайте или где-нибудь еще. Хотя по сути все просто: если вызываешь instance.method() - то this будет ссылаться на instance. Если вызываешь fn() - то this ссылается на глобальный объект (в браузере это window). Если при вызове используешь .call(context) или .apply(context) - то this ссылается на context. Есть еще .bind(context) - вернет новую функцию, навсегда привязанную к контексту context. |
Если у тя модульная система (например RequireJS) не используется, можешь упростить до:
(function($) {...})(jQuery) |
//это обычная функция, получает только аргументы определенные a и b function sum(a,b){ return a+b; } sum(1,4);//выполняется так А это метод $.fn.draw = function(color){ $(this).css('background',color);//красим бэкграунд в определенный цвет } //Вызывается так $('body').draw('red');//красим тело документа в красный цвет Так вот this - в данном случае это body, то есть тот элемент к которому применяется метод methods в данном случае не класс а объект: var methods = {};//создаем объект methods['sum'] = function(){...} call , apply служат для вызов метода с нужным контекстом http://javascript.ru/Function/apply http://javascript.ru/Function/call |
Часовой пояс GMT +3, время: 08:10. |