59 votes

Définir la fonction locale en JavaScript: utiliser var ou pas?

Lorsqu'un local (interne) de la fonction est déclarée dans le code JavaScript, il y a deux options:

Déclarant avec var mot-clé, l'affectation de la variable:

(function() {
    var innerFunction1 = function() { ... };
    innerFunction1();
}());

Déclarant juste avec l' function mot-clé, sans affectation de variable:

(function() {
    function innerFunction2() { ... };
    innerFunction2();
}());

Je vois un avantage de la seconde: la fonction peut être déclarée sous le code qui appelle de sorte qu'il est plus facile de séparer les fonctions privées à partir du code exécuté.

Quel est le mieux et pourquoi?

44voto

Vega Points 44724

En fait, il existe 3 façons de déclarer une fonction,

  1. Déclaration de fonction: Une Déclaration de Fonction définit une fonction nommée variable sans nécessiter l'affectation de variable. Les Déclarations de fonction se produire de manière autonome des constructions et ne peut pas être imbriquées à l'intérieur des non-blocs de fonction. ex: function innerFunction1 () { };

  2. Expression de fonction:: Une Expression de Fonction définit une fonction comme une partie d'une plus grande expression de la syntaxe (en général une affectation de variable ). Fonctions définies par des Fonctions Expressions peuvent être nommés ou anonymes.

    un. À l'aide de fonction anonyme - var innerFunction1 = function() { };

    b. À l'aide de nom de fonction - var innerFunction1 = function myInnerFunction () { };

  3. La fonction constructeur: Une Fonction Constructeur définit une fonction dynamiquement à l'aide de la Fonction( ) constructeur. Notez que la fonction de corps passé à la fonction constructeur est une chaîne de caractères. var innerFunction1 = new Function (arg1, arg2, ... argN, functionBody)

La 3ème méthode n'est pas recommandée, car il a besoin du corps de la fonction comme une chaîne de caractères qui peut empêcher certains JS optimisations du moteur et elle est sujette à des erreurs.

Les différences dans la déclaration de la fonction et de la fonction d'expression sont subtiles et vous devez choisir la méthode qui convient le mieux à vos besoins.

J'ai utiliser la fonction d'expression,

  1. où j'ai besoin d' un singleton fonction
  2. Pour déterminer la fonction à utiliser par programme (en utilisant la fonction nommée expression)

Quelques différences entre la déclaration de la fonction et de la fonction de l'expression,

  1. Expression de fonction vous permet d'attribuer une fonction différente à la variable
  2. D'une fonction définie par une déclaration de fonction peut être utilisée avant la déclaration de la fonction elle-même, fondamentalement, il peut être utilisé n'importe où dans le champ d'application actuel, mais d'une fonction définie par une expression de fonction peut être utilisée après le point qu'il est défini

Cliquez ici pour lire la comparaison détaillée de la Déclaration de la Fonction vs Expression de Fonction vs Fonction Constructeur @MDN

Remarque: la déclaration de La fonction peut être facilement transformé en fonction de l'expression par l'attribution d'une var.

function foo() {}
alert(foo); // alerted string contains function name "foo"
var bar = foo;
alert(bar); // alerted string still contains function name "foo"

Plus De Lecture:

7voto

Halcyon Points 31203

Les deux notations sont fonctionnellement équivalents.

Vous pouvez supposer que:

function a() {}
function b() {}

est interprété comme:

var a, b;
a = function a() {};
b = function b() {};

C'est pourquoi vous n'avez pas à déclarer- (définit pas!) avant utilisation. Vous pouvez réattribuer des fonctions après que vous avez défini, tout comme vous le feriez avec une variable. Fonctions se hisser tout comme les variables, car ils sont variables (de l'esprit=soufflé? bon!!!).


Déclarer avant utilisation

function a() { b(); } // using b before it's declared?
function b() {}

devient:

var a, b;
a = function a() { b(); }; // nope! b is declared, we're good
b = function b() {};

La redéfinition d'une fonction

function a() { alert("a"); }
a = function b() { alert("b"); }; // that's weird!

devient:

var a;
a = function a() { alert("a"); };
a = function b() { alert("b"); }; // oh, that looks normal

Déclarer vs définir

Déclarer est: var x. En anglais: "je vais être en utilisant la variable x".

Définir est: x = 5. En anglais "Variable x a maintenant la valeur 5".

Déclarer avant utilisation est obligatoire et forcée, en "use strict". Définir avant utilisation n'est pas nécessaire. Si vos variables sont définies dans l'exécution vous êtes bon.

Donc, var x = 5 est à la fois un acte de déclaration et d'une définition, qu'est - function a() {}.


Quand utiliser la notation?

Je vous conseille d'utiliser la fonction d'expression de la notation (var a = function () {}) seulement quand vous avez sont réaffectés la valeur de a plus tard. La fonction de l'expression des signaux, puis pour le lecteur qu' a va obtenir réaffectés, et que c'est intentionnel.

Un autre (mineur) argument de la fonction d'expression de la notation est un chiffon outil comme JSLint qui pourrait vous obliger à déclarer (définit pas!) vos fonctions avant de les utiliser. Si vous avez des fonctions avec une définition récursive, c'est à dire. a des appels b et b des appels a, vous ne pouvez pas déclarer l'un avant l'autre à l'aide de la déclaration de la fonction de la notation.

Il est recommandé de ne pas le nom d'une fonction anonyme comme le nom peut substituer accidentellement d'une fonction existante.

var a = function () { alert("a"); };
var b = function a() { alert("b"); };
a(); // prints "b" and it is unclear whether that is intended, so avoid it

4voto

MarmiK Points 3384

La différence est que la fonction avec VAR est définie au moment de l' exécution ,

alors que function () sans VAR est défini au moment de l’ analyse pour un bloc de script.

C'est la seule différence majeure ..

Ainsi, l’utilisateur décidera du type d’exigence à utiliser et de celui qui convient à l’exigence.

2voto

Travis J Points 28588

Il n'y a aucune différence dans la production. Les deux peuvent encore être invoquée et deux ont leur prototype accessible par un nom.

Il y a seulement deux vraies différences.

1) la Lisibilité et de la préférence

Certaines personnes trouvent un moyen plus facile de lire que d'autres, et ils auront à leur tour la base de leur convention de style. Convention suivante est importante.

2) Léger gain de place

Avec minification être de plus en plus pertinent pour les scripts, vous pouvez voir comment il peut être avantageux d'utiliser la deuxième méthode car elle ne nécessite pas l'utilisation d' var ou = qui permettra d'économiser fondamentalement insignifiant 4 caractères de l'espace dans votre minifiés script.


Résumé

Tout se résume à la préférence. Qui est le meilleur? Vous me dites. Personnellement, je vais utiliser var si j'ai l'intention de fabriquer un objet avec new et ensuite je vais mettre en majuscule la première lettre, comme Personne. Sinon, j'ai tendance à camelCase et omettre l'utilisation de var.

1voto

lib3d Points 1679
  • var sans le nom de la fonction

    • c'est mieux si vous maîtrisez vos déclarations de variables: surtout quand elles sont déclarées.


  • Fonction nommée sans var:

    • implique une variable nommée déclaration au début de la portée actuelle et cela peut éviter certaines erreurs,
    • mais: la déclaration d'une fonction de cette manière, à l'aide d'une fermeture variable déclarée avec var échouera si cette fonction est appelée avant la fermeture de la variable est même déclaré. Donc, vous devez savoir ce que vous faites.


  • Fonction appelée avec ou sans var

    • est bon pour la déclaration de la classe
    • et pour le profilage de cause, par exemple, google Chrome dev, outil de profilage sera plus explicite si les fonctions ne sont pas anonymes: ils ont un nom explicite, et vous savez où est la lenteur de la partie de votre code.


  • Fonction nommée et avec var

    • est le moyen d'avoir la fonction d'un nom de champ sans avoir la variable déclarée comme une fermeture
    • tout en gardant la maîtrise de la déclaration de la variable de commande.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X