Maison >interface Web >js tutoriel >js exécute les fonctions immédiatement : quelle est la différence entre (function ( ){})( ) et (function ( ){}( )) ?_compétences javascript
Aucune différence.
Vous devez comprendre le principe de l'IIFE, laissez-moi vous expliquer brièvement :
IIFE n'est pas obligatoire. Pour être plus traditionnel, vous pouvez l'écrire comme ceci :
Alors pourquoi IIFE ?
1. La méthode traditionnelle est lourde, et la définition et l'exécution sont écrites séparément
;
2. La méthode traditionnelle pollue directement l'espace de noms global (objet global dans le navigateur, comme une fenêtre)
Ainsi, les développeurs veulent trouver un moyen de résoudre les problèmes ci-dessus. Alors, est-ce que c'est bien d'écrire comme ça ?
fonction foo(...){}();
Bien sûr que non, mais pourquoi ? Parce que la partie function foo(...){} n'est qu'une instruction, pour l'interprète, c'est comme si vous aviez écrit une chaîne "function foo(...){}", qui nécessite l'utilisation de fonctions d'analyse, telles que eval() pour l'exécuter. Donc mettre () directement après l'instruction ne sera pas exécuté, ce qui est une mauvaise syntaxe.
Comment y remédier ? C'est facile à dire, il suffit de transformer la déclaration en expression (Expression).
En fait, il existe de nombreuses façons de transformer des expressions. La méthode la plus courante consiste à envelopper la déclaration de fonction avec une paire de (), elle devient donc :
Cela équivaut à :
Mais la façon dont nous disions qu'il était impossible d'écrire auparavant peut en fait être mise directement entre parenthèses. C'est aussi une expression équivalente :
.(function foo(){...}());
Alors vous demandez, y a-t-il une différence ? Très simple : Non~
De plus, comme je viens de le dire il existe de nombreuses façons de transformer des expressions, il existe effectivement bien d'autres façons de les écrire, comme par exemple :
!function foo() {...}();
ou
fonction foo() {...}();
Tout va bien.
Personnellement, je préfère utiliser void pour convertir des expressions, car ce mot-clé n'a pas de valeur de retour. Mais ce point n’a vraiment pas d’importance, traitez-moi simplement comme une « tortue »…
OK, ce qu'on appelle ne pas polluer l'espace de noms global est dû au fait que IIFE crée une nouvelle portée de fonction et que votre véritable code métier y est encapsulé, il ne touchera donc naturellement pas l'objet global. Si vous avez besoin de l'objet global, transmettez-le à IIFE :
J'ai écrit une série ici, dont l'une parle de la portée et de la promotion des noms. Les points de connaissances qu'elle contient sont utiles pour comprendre l'IIFE. Si vous êtes intéressé, vous pouvez continuer à lire en profondeur : http://. www.jb51.net/article/75090.htm
Première méthode, appelez la fonction et obtenez la valeur de retour. Force l'exécution directe de la fonction puis renvoie une référence, qui est ensuite appelée et exécutée
Deuxième méthode, appelez la fonction et obtenez la valeur de retour. L'opérateur de coercition provoque l'exécution des appels de fonction
(function(){})(); consiste à analyser la fonction en tant qu'expression, puis à exécuter la fonction analysée
Équivalent à var a = function(){}; a(); a obtient la fonction
(function(){}()); consiste à exécuter directement l'expression de la fonction et à l'exécuter sous forme d'instruction,
Équivalent à var a = function(){}(); a obtient le résultat
Le résultat final est le même,
() joue juste le rôle d'auto-exécution
Il y en a beaucoup d'autres comme ()
Par exemple la fonction (){}
Ceci est égal à (function (){}). Généralement, (function (){}) a un autre effet, qui est d'éviter les variables globales