In your example, you simply have two statements and it is equivalent to:
function foo(bar){
return bar;
}
0;
This is not a self-invoking function. The first statement is a function declaration, the second statement is simply the number literal 0
, which does not do anything. The parenthesis don't execute the function, they are the grouping operator.
How can we prove this? Try:
function foo(bar){
return "bar";
}(0);
and tell me what the output is.
It would be a self-invoking function, if we had a function expression. For that you can use the grouping operator to force it being evaluated as expression.
For example:
(function foo(bar){
return bar;
})(0);
This is a named function expression. The result of the expression ((function ....)
) is a function reference, and (0)
executes the function, passing 0
as argument.
The position of the parenthesis could also be:
(function foo(bar){
return bar;
}(0));
Maybe this is what you have seen.
This technique was already extensively discussed here: What is the purpose of a self executing function in javascript?