2017-06-16 1 views
3

Je crois comprendre que l'opérateur de regroupement autour de ma déclaration de fonction force la fonction à être évaluée en tant qu'expression.Comment les noms de fonctions sont-ils stockés dans un IIFE?

(function hidden(){ 
    console.log("hidden"); 
})() 

Lorsque je tente de lancer cela, il y a une erreur qui indique que hidden est un identifiant inattendu.

(function hidden(){ 
    console.log("hidden"); 
} 
hidden(); 
)(); 

Est-ce parce que l'interprète n'enregistre pas la première instance de hidden? Si oui, pourquoi exactement?

+0

Qu'est-ce que vous essayez de atteindre avec le deuxième morceau de code? – Icepickle

+0

"il y a une erreur qui indique que hidden est un identifiant inattendu." --- Non, le message d'erreur ne dit pas cela. – zerkms

+0

votre deuxième bloc de code n'est pas valide du tout - et si vous avez déplacé 'hidden();' dans le '{}' vous vous retrouveriez avec trop de récursion –

Répondre

1

Il y a un bon article par Angus Croll sur la différence entre une déclaration de fonction et une expression de fonction en javascript (https://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/)

Fondamentalement, ce que vous essayez de faire est de traiter la fonction cachée() comme une déclaration de fonction à l'intérieur d'une expression de fonction. Comme l'indique Croll dans l'article, à l'intérieur d'une expression de fonction, "le nom de la fonction (le cas échéant) n'est pas visible en dehors de sa portée (contrairement aux déclarations de fonctions)."

Si vous réécrivez la fonction anonyme comme une mission, il fait le point plus clair, je pense:

var a = function hidden() { 
    console.log('inside hidden'); 
} 

maintenant cela erreur:

var a = function hidden() { 
    console.log('inside hidden'); 
} 
hidden(); 

parce que le nom de la fonction n'est pas disponible à l'extérieur de son propre contexte.

Cependant, cela fonctionne très bien:

var a = function hidden() { 
    console.log('inside hidden'); 
} 
a(); 

puisque la variable peut être référencée en dehors de son propre contexte que vous attendez (sinon il ne serait pas accessible partout, mais à l'intérieur du corps de la fonction cachée()) .

Si nous regardons à nouveau la version anonyme vous pouvez voir pourquoi il échoue:

(function hidden() { 
    console.log('inside hidden'); 
} 
// We're outside of IIFEs function body here 
// so NO code can be executed. 
)(); 
+0

Je ne suis pas sûr que ce soit correct, Si vous avez appelé le code où se trouve le commentaire, cela ne serait-il pas invalide? J'aurais pensé que le tout aurait besoin d'être enveloppé dans une autre fonction? sinon (expression)() ne fait rien? –

+0

@RyanTheLeach oui je pense que nous disons tous les deux la même chose? Lorsque ce commentaire figure dans le dernier extrait de code, vous ne pouvez pas exécuter la fonction 'hidden()'. – JiuJitsuCoder

+0

Je ne pense pas que vous pouvez exécuter * n'importe quoi * qui n'a pas de fonction comme type de retour? –

0

Parce qu'il est tout simplement une erreur parsing/syntaxe, comme vous le dites, « identifiant inattendu ». Vous pouvez résoudre ce problème en utilisant l'opérateur de virgule: (function hidden() { ... }, hidden()), mais le nom hidden (contenant l'objet fonction) de votre expression de fonction sera uniquement disponible dans la portée de la fonction. Vous pouvez résoudre ceci en faisant une définition à la place:

(function() { 
    function hidden(){ 
     console.log("hidden"); 
    } 
    hidden(); 
})(); 

Vous pouvez également faire des définitions liées. Comme...

ES4 (reference interpreter builds):

{ 
    let function hidden() 
    { 
     console.log("hidden"); 
    } 
    hidden(); 
} 

ES6 basé JavaScript

{ 
    let hidden = function() 
    { 
     console.log("hidden"); 
    } 
    hidden(); 
} 
-1

D'autre part ce qui suit est parfaitement valable:

(two = function() { 
 
    console.log('two'); 
 
}, 
 
console.log('one'), 
 
two)()

+0

Eh bien, vous créez une variable globale. -1 Ouais, vous en faites une expression au lieu d'une déclaration, si vous ajoutez une meilleure explication, je vais supprimer le downvote. –

0

Vous avez une erreur de syntaxe, car

(function hidden(){ 
    console.log("hidden"); 
} 
hidden();) 

est pas une expression, mais

(function hidden(){ 
    console.log("hidden"); 
}) 

est une expression qui renvoie la fonction elle-même et que vous appelez avec ().

Vous pouvez en faire une expression en ajoutant une virgule entre les deux parties et en supprimant le point-virgule. Cependant, hidden ne serait défini que dans la fonction elle-même et vous ne pourriez pas l'appeler. Ce qu'on appelle un named function expression

// Uncaught ReferenceError: hidden is not defined 
(function hidden(){ 
    console.log("hidden"); 
}, 
hidden()) 

Vous vouliez probablement dire effectuer les opérations suivantes

(function() { 
    function hidden(){ 
     console.log("hidden"); 
    } 
    hidden(); 
})() 

Dans ce cas, vous créez une déclaration de fonction qui est visible dans le Ia vie contenant