Подтвердить что ты не робот

Javascript function vs. (function() {...}());

Я часто вижу такие выражения, как:

(function () {
    var x = 1;
    ...
}());

Как это интерпретировать? синтаксически это само по себе является анонимным определением функции.

function() {
...
}

что после этого? и почему положить его в include()?

Спасибо

4b9b3361

Ответ 1

Точно так же, за исключением того, что он вызывается сразу же после преобразования в выражение функции.

// v-----first set of parentheses makes the function an expression
   (function () {
       var x = 1;
       ...
   }());
//  ^-----this set is used to invoke the function

То же, что и вы:

   var myfunc = function () {
       var x = 1;
       ...
   };
   myfunc();

или (аналогично):

   var returnValue = function () {
       var x = 1;
       ...
   }();

Избавьтесь от имен, переместите круглые скобки вокруг, и вы увидите, что они не такие разные.

Ответ 2

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

 var someVal = 1;

 setTimeout( (function(one) {
      return function() {
           alert(one);  // alerts a 1 even 10 seconds after someVal++;
      }
 })(someVal), 10000);

 someVal++;  // the value in the setTimeout will remain the same as it is locked inside.

В этом контексте setTimeout принимает функцию, которая не принимает аргументов. Поэтому вопрос о том, как передать значение этой функции, отвечает на создание функции, которая принимает один аргумент, который возвращает функцию, которая принимает 0 аргументов.

Я предлагаю всем, кто хочет узнать больше о силе этой нотации, чтобы поиграть с ней в консоли JavaScript Firebug. После того, как вы закроете эту концепцию, вы начнете видеть области, где можно использовать эту мощную концепцию.