Javascript - ярлык для вызова функции в то же время определяется

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

var newfunc = function() {
 alert('hi');
};
newfunc();

является правильным способом комбинирования этих 2:

var newfunc = function() {
 alert('hi');
}();
5 ответов

Нет. Второй пример немедленно вызовет анонимную функцию и присвоит ее возвращаемому значению newfunc.

adamse описывает подход, который, как представляется, работает. Я бы все же избегал подхода, поскольку двухэтапный процесс легче читать и, следовательно, будет легче поддерживать.


var newfunc = function f() {
 alert("hi!");
 return f;
}();

Наличие названных функциональных выражений позволяет функции рекурсивно называть себя или, в этом случае, возвращаться. Однако эта функция всегда будет возвращаться, что может вызвать раздражение.


Могло быть несколько причин, по которым вы хотите это сделать. Я не уверен, что у вас есть, но позвольте мне представить пару любимых шаблонов:

Образец № 1: синглтон. Функция выполняется, а затем становится объектом singleton для использования другими компонентами вашего кода.

var singletonObject = new function() {
 // example private variables and functions
 var variable1 = {};
 var variable2 = {};
 var privateFunction = function() { 
 };
 // example public functions
 this.getData = function() { 
 return privateFunction(variable1, variable2);
 };
 // example initialisation code that will only run once
 variable1.isInitialised = true;
};

Образец № 2: самоисполняющаяся анонимная функция... удобна для многих причин!

// Declare an anonymous function body. 
// Wrap it in parenthesis to make it an "expression.
// Execute it by adding "();"
(function(){})();

И вот пример, который также создает пространство имен для ваших объектов. Я использую "NS" в качестве примера пространства имен:

// declare the anonymous function, this time passing in some parameters
(function($, NS) {
 // do whatever you like here
 // execute the function, passing in the required parameters. 
 // note that the "NS" namespace is created if it doesn't already exist
})(jQuery, (window.NS = window.NS || {}));

Вы также можете установить контекст функции самоисполнения с помощью .call или .apply вместо обычной скобки, например:

(function($){
 // 'this' now refers to the window.NS object
}).call(window.NS = window.NS || {}, jQuery);

или

(function($){
 // 'this' now refers to the window.NS object
}).apply(window.NS = window.NS || {}, [jQuery]);


Если я правильно понял ваш вопрос, попробуйте:

(f = function (msg) {
 msg = msg ? msg : 'default value';
 alert(msg); }
)();
f('I\'m not the default value!');

Вы получите два предупреждения, первый из них скажет "значение по умолчанию", а второе скажет "Я не значение по умолчанию. Вы можете увидеть его в действии на jsBin. Нажмите" Предварительный просмотр", чтобы запустить его.


вы можете сделать следующее:

o = {};
o.newfunc = ( function() {
function f() {
 alert('hi');
}
f();
return {
 f : f
};
}
)();

затем вызов функции like:

o.newfunc.f();

также выдает предупреждающее сообщение

licensed under cc by-sa 3.0 with attribution.