2010-06-09 7 views
1

Duplicate possible:
JavaScript scope and closuresyntaxe Javascript avec() - Portée de la fonction

Je ne suis pas très familier avec le soufflet de syntaxe Javascript. Quelqu'un peut-il éclairer la lumière sur le sens de ce bloc? Dans quel but?

 
(function foo() { 
    alert('bar'); 
})(); 

Merci d'avance.

+0

et de http://stackoverflow.com/questions/2897987/why-would-one-write-global-code-inside-a-function-definition-call-pair – nico

+0

et un autre http: // stackoverflow.com/questions/592396/what-is-the-purpose-of-a-self-executing-function-in-javascript – Anurag

+0

Sa question est différente de celles-ci, car il a un nom sur sa fonction de fermeture, créant une complète Différent ensemble de problèmes (bien que, il peut ou ne peut pas avoir l'intention de) –

Répondre

0

Javascript vous permet de déclarer des fonctions à la volée - on les appelle des fermetures - et cela se fait dans votre exemple entre les premiers ensembles de parenthèses. Lorsque vous introduisez le second ensemble de parenthèses, vous appelez cette fonction que vous venez de définir. La distinction à noter est la différence entre la déclaration/définition de fonction et l'application de cette fonction.

1

Le but est d'étendre la portée de votre travail hors de portée mondiale. Cela aide à encapsuler vos objets et les empêche de polluer le pool global. Toutes les variables que vous déclarez globalement à la fonction contenant foo() ne seront pas disponibles, sauf pour les fonctions déclarées dans la fonction foo()

var GLOBALVAR //this is available to the global document scope 
(function foo() { 
    var FOOVAR //only available within this function 
    function bar(){ 
     FOOVAR = GLOBALVAR //this will work 
    } 
    alert('bar'); 
})(); 
FOOVAR = GLOBALVAR //This will not because FOOVAR is out of scope 
2

Cela ressemble à une mauvaise pratique me (nommant une fonction de fermeture), car il peut provoquer des incohérences de navigateur.

Prenez le code suivant par exemple

(function foo() { 
    alert('bar'); 
})(); 
foo(); 

Dans Internet Explorer, vous obtiendrez 2 alertes, car il crée en fait la fonction en fonction globale appelée foo.

Dans Chrome, il ne préviendra une fois, et foo n'a pas été déclarée à l'échelle mondiale, de sorte que vous obtenez une erreur javascript foo is not defined

Normalement, vous ne seriez pas donner un nom à une fonction de fermeture

(function() { // notice you don't see foo anymore 
    alert('bar'); 
})(); 
+0

Je n'étais pas au courant des problèmes dans la dénomination des fonctions de fermeture. Pas que j'aie jamais fait ça mais c'est bon à savoir. –

0

var tokenizer = (fonction() { var id = 0; return function() { return id ++; }; })();

tokenizer(); // 0 
tokenizer(); // 1 
tokenizer(); // 2 
alert(id); // undefined 
Questions connexes