Maison >interface Web >js tutoriel >js exécute les fonctions immédiatement : quelle est la différence entre (function ( ){})( ) et (function ( ){}( )) ?_compétences javascript

js exécute les fonctions immédiatement : quelle est la différence entre (function ( ){})( ) et (function ( ){}( )) ?_compétences javascript

WBOY
WBOYoriginal
2016-05-16 15:31:191074parcourir

Aucune différence.

Vous devez comprendre le principe de l'IIFE, laissez-moi vous expliquer brièvement :

Copier le code Le code est le suivant :

function foo() {...} // Ceci est une définition, Déclaration ; la définition permet uniquement à l'interpréteur de savoir qu'elle existe, mais elle ne s'exécutera pas.
foo(); // Ceci est une instruction, Statement; l'interpréteur l'exécutera lorsqu'il rencontrera une instruction.

IIFE n'est pas obligatoire. Pour être plus traditionnel, vous pouvez l'écrire comme ceci :

Copier le code Le code est le suivant :

fonction foo() {...}
foo();

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 :

Copier le code Le code est le suivant :

(function foo() {...}) // Il s'agit d'un saut de ligne délibéré, et il peut en fait être connecté avec les parenthèses suivantes
();

Cela équivaut à :

Copier le code Le code est le suivant :

var foo = function () {...}; // Ce n'est pas une définition, mais une expression.
foo();

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 »…

Copier le code Le code est le suivant :

fonction void () {
//Voici le code dont vous avez vraiment besoin
}();

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 :

Copier le code Le code est le suivant :

fonction void (globale) {
//Ici, global est l'objet global
}(this) // Dans le navigateur, c'est l'objet window

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

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn