JavaScript: самовыполняющаяся функция с параметром

CodeMirror.net использует эту конструкцию (я немного упрощаю), чтобы представить код для своего редактора JavaScript:

(function(mod) {
        this.CodeMirror = mod();
    })(function() {
      "use strict";
       (15,000-odd lines of advanced JS)
    }

Теперь я понимаю, что это самоисполняющаяся функция, и я прочитал несколько постов о них. Я понимаю, что на практике этот код создает объект CodeMirror. Я просто не понимаю механику.

  1. Какова роль параметра (мода)? В более широком смысле, что это означает, когда вы задаете параметр для самореализующейся функции?
  2. Какова роль объявления внутренней функции ()? Похоже, это как-то связано с модом?

Спасибо за вашу помощь.

2 ответа

Решение

В вашем коде:

(function(mod) {
    this.CodeMirror = mod();
})(function() {
  "use strict";
   (15,000-odd lines of advanced JS)
}

mod является формальным параметром для немедленно вызванной функции. Это как если бы функция была объявлена ​​более простым способом:

function something(mod) {
    this.CodeMirror = mod();
}

Эта функция явно ожидает, что mod Параметр будет ссылаться на какую-то другую функцию, потому что единственное, что он делает, - это вызывает функцию.

Фактически вызываемая функция вызывается с функцией в качестве значения mod параметр: в частности, этот:

function() {
  "use strict";
   (15,000-odd lines of advanced JS)
}

Эта функция делает все, что она делает, и (предположительно) возвращает ссылку на объект, который будет использоваться в качестве глобального CodeMirror точка входа.

Потому что первая функция - немедленно вызванная - вызывается без каких-либо явных this значение, он ожидает, что this будет установлено значение глобального контекста, или window в браузере. Лично я думаю, что было бы безопаснее сделать это явно:

(function(mod) {
    this.CodeMirror = mod();
}).call(this, function() {
  "use strict";
   (15,000-odd lines of advanced JS)
})

В глобальном лексическом контексте гарантируется, что this будет ссылка на глобальный контекст, "строгий" режим или нет. Но если эта внешняя немедленно вызываемая функция просто вызывается, то this будет undefined в "строгом" режиме и инициализация не удалась.

(function(mod) {
  this.CodeMirror = mod();
})(function() {
    "use strict";
    //(15,000-odd lines of advanced JS)
})

Ничего странного или волшебного здесь не происходит, Вот поток этого:

  1. (function(mod) { this.CodeMirror = mod(); }) Это объявляет анонимную функцию и принимает параметр mod,
  2. Тогда линия this.CodeMirror = mod(); принимает mod и вызывать его как метод, подразумевая, что программист ожидает, что mod будет функцией. Значение RETURN этого метода присваивается объекту Window.CodeMirror. Самовозвратные функции имеют свои this установлен в Window Объект.
  3. Скобки сразу после объявления анонимной функции вызывают его, и в этих скобках функции передается параметр.

Сводка: Результат функции, имеющий 15000 строк кода, присваивается Window.CodeMirror

Другие вопросы по тегам