JavaScript: самовыполняющаяся функция с параметром
CodeMirror.net использует эту конструкцию (я немного упрощаю), чтобы представить код для своего редактора JavaScript:
(function(mod) {
this.CodeMirror = mod();
})(function() {
"use strict";
(15,000-odd lines of advanced JS)
}
Теперь я понимаю, что это самоисполняющаяся функция, и я прочитал несколько постов о них. Я понимаю, что на практике этот код создает объект CodeMirror. Я просто не понимаю механику.
- Какова роль параметра (мода)? В более широком смысле, что это означает, когда вы задаете параметр для самореализующейся функции?
- Какова роль объявления внутренней функции ()? Похоже, это как-то связано с модом?
Спасибо за вашу помощь.
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)
})
Ничего странного или волшебного здесь не происходит, Вот поток этого:
(function(mod) { this.CodeMirror = mod(); })
Это объявляет анонимную функцию и принимает параметрmod
,- Тогда линия
this.CodeMirror = mod();
принимаетmod
и вызывать его как метод, подразумевая, что программист ожидает, что mod будет функцией. Значение RETURN этого метода присваивается объекту Window.CodeMirror. Самовозвратные функции имеют своиthis
установлен вWindow
Объект. - Скобки сразу после объявления анонимной функции вызывают его, и в этих скобках функции передается параметр.
Сводка: Результат функции, имеющий 15000 строк кода, присваивается Window.CodeMirror