Простая причина, по которой это не работает, не в том, что ;
указывает на конец анонимной функции. Это потому, что без ()
в конце вызова функции, это не вызов функции. То есть
function help() {return true;}
Если вы вызываете result = help();
, это вызов функции и она возвращает true.
Если вы звоните result = help;
, это не звонок. Это задание, в котором помощь рассматривается как данные, которые должны быть присвоены результату.
То, что вы сделали, объявили / создали экземпляр анонимной функции, добавив точку с запятой,
(function (msg) { /* Code here */ });
, а затем попытались вызвать ее в другом операторе, используя только круглые скобки ... Очевидно, потому что функция не имеет имени , но это не сработает:
('SO');
Интерпретатор видит круглые скобки во второй строке как новую инструкцию / инструкцию, и поэтому он не работает, даже если вы сделали это так:
(function (msg){/*code here*/});('SO');
Это все еще не работает, но работает, когда вы удаляете точку с запятой, потому что интерпретатор игнорирует пробелы и каретки и видит полный код как одно утверждение.
(function (msg){/*code here*/}) // This space is ignored by the interpreter
('SO');
Вывод: вызов функции не является вызовом функции без конца ()
в конце, если только при определенных условиях, например, при вызове другой функции, то есть onload = 'help' не выполнит функцию справки даже хотя скобки не были включены. Я полагаю, что setTimeout и setInterval также разрешают этот тип вызова функции, и я также считаю, что интерпретатор в любом случае добавляет скобки за кулисы, что возвращает нас к «вызову функции не является вызовом функции без скобок».
Да.
В JavaScript можно передавать функции, которые будут служить той же цели, что и лямбда-выражения в коде C #. В качестве примера возьмем "каждый" JQuery:
$('div.several').each(function() {
// Do something with the current div.
});
Вы также можете довольно легко создавать вложенные объекты:
var outer = {
inner1: {
val1: 'a',
val2: 'b'
},
inner2: {
val1: 'c',
val2: 'd'
}
};
Конечно, вы можете делать это динамически, а не все сразу:
var outer = {};
outer.inner1 = {};
outer.inner1.val1 = 'a';
...
Затем, чтобы сделать то, что вы ищете, вам нужно будет использовать массивы:
var result = [];
for (var i=0; i<x; ++i) {
result[result.length] = GetIndividualResult(i);
}