Удалите точку с запятой после определения функции.
(function (msg){alert(msg)})
('SO');
Выше должно работать.
ДЕМО-страница: https://jsfiddle.net/e7ooeq6m/
Я обсуждал этот тип паттерна в этом посте:
jQuery и $ questions
EDIT:
Если вы посмотрите на спецификацию сценария ECMA , есть 3 способа определить функцию. (Стр. 98, раздел 13 «Определение функций»)
1. Использование конструктора функций
var sum = new Function('a','b', 'return a + b;');
alert(sum(10, 20)); //alerts 30
2. Использование объявления функций.
function sum(a, b)
{
return a + b;
}
alert(sum(10, 10)); //Alerts 20;
3. Выражение функции
var sum = function(a, b) { return a + b; }
alert(sum(5, 5)); // alerts 10
Итак, вы можете спросить, в чем разница между декларацией и выражением?
Из спецификации скрипта ECMA:
FunctionDeclaration:
идентификатор функции (FormalParameterListopt) {FunctionBody
}
FunctionExpression:
function Identifieropt (FormalParameterListopt) {FunctionBody
}
Если вы заметили, «идентификатор» равен необязательно для выражения функции. И когда вы не даете идентификатор, вы создаете анонимную функцию. Это не значит, что вы не можете указать идентификатор.
Это означает, что действует следующее.
var sum = function mySum(a, b) { return a + b; }
Важно отметить, что вы можете использовать 'mySum' только внутри тела функции mySum, а не снаружи. Смотрите следующий пример:
var test1 = function test2() { alert(typeof test2); }
alert(typeof(test2)); //alerts 'undefined', surprise!
test1(); //alerts 'function' because test2 is a function.
Демонстрационная версия
Сравните это с
function test1() { alert(typeof test1) };
alert(typeof test1); //alerts 'function'
test1(); //alerts 'function'
Вооружившись этими знаниями, давайте попробуем проанализировать ваш код.
Если у вас есть такой код,
function(msg) { alert(msg); }
Вы создали выражение функции. И вы можете выполнить это выражение функции, заключив его в круглые скобки.
(function(msg) { alert(msg); })('SO'); //alerts SO.