javascript - Explain the encapsulated anonymous function syntax -


summary

can explain reasoning behind syntax encapsulated anonymous functions in javascript? why work: (function(){})(); doesn't: function(){}();?


what know

in javascript, 1 creates named function this:

function twoplustwo(){     alert(2 + 2); } twoplustwo(); 

you can create anonymous function , assign variable:

var twoplustwo = function(){     alert(2 + 2); }; twoplustwo(); 

you can encapsulate block of code creating anonymous function, wrapping in brackets , executing immediately:

(function(){     alert(2 + 2); })(); 

this useful when creating modularised scripts, avoid cluttering current scope, or global scope, potentially conflicting variables - in case of greasemonkey scripts, jquery plugins, etc.

now, understand why works. brackets enclose contents , expose outcome (i'm sure there's better way describe that), such (2 + 2) === 4.


what don't understand

but don't understand why not work equally well:

function(){     alert(2 + 2); }(); 

can explain me?

it doesn't work because being parsed functiondeclaration, , name identifier of function declarations mandatory.

when surround parentheses evaluated functionexpression, , function expressions can named or not.

the grammar of functiondeclaration looks this:

function identifier ( formalparameterlistopt ) { functionbody } 

and functionexpressions:

function identifieropt ( formalparameterlistopt ) { functionbody } 

as can see identifier (identifieropt) token in functionexpression optional, therefore can have function expression without name defined:

(function () {     alert(2 + 2); }()); 

or named function expression:

(function foo() {     alert(2 + 2); }()); 

the parentheses (formally called the grouping operator) can surround expressions, , function expression evaluated.

the 2 grammar productions can ambiguous, , can same, example:

function foo () {} // functiondeclaration  0,function foo () {} // functionexpression 

the parser knows if it's functiondeclaration or functionexpression, depending on context appears.

in above example, second 1 expression because comma operator can handle expressions.

on other hand, functiondeclarations appear in what's called "program" code, meaning code outside in global scope, , inside functionbody of other functions.

functions inside blocks should avoided, because can lead unpredictable behavior, e.g.:

if (true) {     function foo () { alert('true'); } } else {     function foo () { alert('false!'); } }  foo(); // true? false? why? 

the above code should produce syntaxerror, since block can contain statements (and ecmascript specification doesn't define function statement), implementations tolerant, , take second function, 1 alerts 'false!'.

the mozilla implementations -rhino, spidermonkey,- have different behavior. grammar contains non-standard function statement, meaning function evaluated @ run-time, not @ parse time, happens functiondeclarations. in implementations first function defined.


functions can declared in different ways, compare following:

1- function defined function constructor assigned variable multiply:

var multiply = new function("x", "y", "return x * y;"); 

2- function declaration of function named multiply:

function multiply(x, y) {     return x * y; } 

3- function expression assigned variable multiply:

var multiply = function (x, y) {     return x * y; }; 

4- named function expression func_name, assigned variable multiply:

var multiply = function func_name(x, y) {     return x * y; }; 

Comments

Popular posts from this blog

php - How to display all orders for a single product showing the most recent first? Woocommerce -

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -