• [^] # Re: Fonction

    Posté par . En réponse au journal Plonk. Évalué à -2.

    Si tant est que cela puisse aider...

    Je crois qu'il faut rappeler dans quel contexte cette syntaxe à était popularisé.

    Le problème est le suivant, sur une page web (node est un autre cas), les scripts sont chargés et appliquer au contexte global.

    <script src='a.js'></script>
    <script src='b.js'></script> 

    Ici a et b partage le même contexte, une variable déclarée dans a est accessible dans b, vis-et-versa.

    Donc au départ cette syntaxe apparait pour éviter les conflits de nommage de variable entre deux scripts de sources distincts (exemple, les scripts d'analytique chargés par dizaine sur certains sites).

    A l'époque c'était une avancée appréciable, et appréciée.

    Il faut préciser aussi que cette structure a était utilisée à un moment donné pour des boucles for mal foutu, exemple,

    for(var i=0;i<5; i++){
     setTimeout(function (){console.log(i);}, 1); // affiche 5,5,5,5,5 etc
    }

    Résolution pourrie,

    for(var i=0;i<5; i++){
     (function(i){setTimeout(function (){console.log(i);}, 1);})(i); // affiche 0,1,2,3,4 etc
    }

    Résolution correcte,

    [0,1,2,3,4].forEach(function(i){
     setTimeout(function (){console.log(i);}, 1); // affiche 0,1,2,3,4
    });

    Pour en revenir à IIFE (Immediately Invoked Function Expression) les parenthèses '()' sont là pour appeler l'exécution de la fonction définie.
    On peut en avoir plusieurs par scripts, donc ce n'est même pas l'équivalent stricte d'un main.
    Par contre, en pratique, on s'en sert par convention comme un genre de main, en effet.

    Cette structure (f(){})() semble être l'équivalent des blocs en C comme tu le cites.

    Pour finir, cette structure tant à être désuète car on utilise de plus en plus des modules de chargement qui encapsule automatiquement le code dans une fonction pour éviter ces effets de bords d'écrasement de variable (cf AMD, require.js etc), et d'autres trucs.
    Par ailleurs, avec node, c'est automatique, puisque l'utilisation de require fais ce travail.

    En ce qui me concerne, est ce que c'est beau, est ce que c'est bien : osef.
    Lorsque j'écris du node, je n'ai jamais besoin de celle ci,
    Lorsque j'écris du web, j'utilise un système de build, donc je n'en ai pas besoin non plus et le cas de la boucle for sus cité, c'est vraiment de la m**** d'écrire ce code.

    quand à savoir si un main serait utile à JS, bof, si j’arrive pas à trouver le main d'un script, je préfère faire autre chose que de m'en servir.