Javascript function vs. (function() {...}());
Я часто вижу такие выражения, как:
(function () {
var x = 1;
...
}());
Как это интерпретировать? синтаксически это само по себе является анонимным определением функции.
function() {
...
}
что после этого? и почему положить его в include()?
Спасибо
Ответы
Ответ 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. После того, как вы закроете эту концепцию, вы начнете видеть области, где можно использовать эту мощную концепцию.