Verstädnisfrage: alert vs Error und +function vs function

  • Themenstarter Themenstarter Netzwerkidi
  • Beginndatum Beginndatum
Genau diese Frage hatte ich erst neulich bei StackOverflow gelesen ;)
Habe den Link nicht zur Hand und SO ist auch leider down, deswegen hier die Erklärung von mir:

Es gibt Function Declarations und Function Expressions.
Function Expressions sind im Prinzip direkt mit () aufrufbar, Function Declarations nicht.

Javascript:
// Function Declaration
function a() {
}

// Function Expression
bla(function () {
});

// Function Expression
// selbstaufrufend

(function () {
  bla
})();
Im letzten Beispiel ruft sich die Function Expression sozusagen selbst wegen der () auf.
Allerdings ist da die Einklammerung des Function-Konstrukts wichtig ('(' vor function und ')' nach '}').
Wenn man diese weglässt, so denkt der JS-Interpreter, dass es eine Function Declaration wäre und würde () als einen Syntaxfehler ansehen.
Deswegen schreibt man ein '+' dort hin, sodass der JS-Interpreter dazu gezwungen wird, das Ganze als Function Expression anzusehen. Funktioniert übrigens auch mit "~" oder "-", etc.
 
Noch eine gute Quelle: http://benalman.com/news/2010/11/immediately-invoked-function-expression/

Javascript:
// Either of the following two patterns can be used to immediately invoke
// a function expression, utilizing the function's execution context to
// create "privacy."

(function(){ /* code */ }()); // Crockford recommends this one
(function(){ /* code */ })(); // But this one works just as well

// Because the point of the parens or coercing operators is to disambiguate
// between function expressions and function declarations, they can be
// omitted when the parser already expects an expression (but please see the
// "important note" below).

var i = function(){ return 10; }();
true && function(){ /* code */ }();
0, function(){ /* code */ }();

// If you don't care about the return value, or the possibility of making
// your code slightly harder to read, you can save a byte by just prefixing
// the function with a unary operator.

!function(){ /* code */ }();
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();

// Here's another variation, from @kuvos - I'm not sure of the performance
// implications, if any, of using the `new` keyword, but it works.
// http://twitter.com/kuvos/status/18209252090847232

new function(){ /* code */ }
new function(){ /* code */ }() // Only need parens if passing arguments
 
Interessant, nur warum ist dieser Code
Code:
(function(){ /* code */ }()); // Crockford recommends this one
offenbar korrekt und der hier
Code:
function(){ /* code */ }(); // SyntaxError: Unexpected token
nicht? Fehlt nur die Klammer um alles.
 
Beim Ersten wird function () {...} als Function Expression evaluiert und erlaubt somit die Nutzung von () danach.

Beim Zweiten wird function () {...} als Function Declaration interpretiert und erlaubt somit nicht die Nutzung von () danach.

Das liegt an der Grammatik von JavaScript (bzw. ECMAScript).
 
Das ist der Unterschied zwischen function expression und function declaration. Das erste ist eine expression, das zweite eine declaration (gefolgt von zwei Klammern, die da nicht hin gehören). Im ersten Fall wird es zu einer expression, weil innerhalb der Klammern keine declaration erwartet wird/erlaubt ist.
 
Kann man sagen, die äußere Klammer macht die function declaration zur function expression und damit ausführbar?
 

Neue Beiträge

Zurück