Показать сообщение отдельно
  #3 (permalink)  
Старый 28.04.2014, 12:47
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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.
__________________
В личку только с интересными предложениями
Ответить с цитированием