2016-05-05 3 views
4

Voici le code que je l'ai rencontré:javascript - quel est le but de déclarer une variable une fonction en premier? (Déclarant deux fois variable)

var c = function() {}, 
     c = { 
      autoSelectFirst: !1, 
      appendTo: "body", 
      serviceUrl: null, 
      lookup: null, 
      .. etc.. 
      lookupFilter: function(a, b, c) { 
       return -1 !== a.value.toLowerCase().indexOf(c) 
      }, 
      .. etc.. 
     }; 

Pourquoi c d'abord déclaré comme une fonction vide puis re-déclarée comme un objet? Cela ne remplace-t-il pas simplement la déclaration de fonction? Je suppose que c'est une construction JS fondamentale.

+11

Cela ressemble à du code écrit par quelqu'un qui ne savait vraiment pas ce qu'il faisait, ou bien le résultat d'une sorte d'erreur d'édition. – Pointy

+1

Où l'avez-vous rencontré? Le code a-t-il été minifié? On dirait que cela pourrait être un artefact d'un générateur de code automatisé de quelque sorte. Les noms des variables et des paramètres le font ressembler à cela. Pouvez-vous donner un contexte? –

+0

un jour dans un futur lointain j'apprendrai toutes les manières de déclarer une fonction dans js. En a ajouté un autre aujourd'hui. Je me demande ce que d'autres leurres dans les coins sombres du web ...: D –

Répondre

2

Sur la base de cet exemple de code de la question initiale:

var c = function() {}, 
    c = { 
     autoSelectFirst: !1, 
     appendTo: "body", 
     serviceUrl: null, 
     lookup: null, 
     .. etc.. 
     lookupFilter: function(a, b, c) { 
      return -1 !== a.value.toLowerCase().indexOf(c) 
     }, 
     .. etc.. 
    }; 

La partie c = function() {}, dans le code qui est inclus dans votre question n'a pas de point. Il est comme faire:

var x = 1, x = 3; 

Il n'y a aucun point à attribuer une valeur à la variable puis attribuer immédiatement une autre valeur.

Le code que vous montrez générerait exactement le même résultat (avec moins de confusion) comme ceci:

var c = { 
     autoSelectFirst: !1, 
     appendTo: "body", 
     serviceUrl: null, 
     lookup: null, 
     .. etc.. 
     lookupFilter: function(a, b, c) { 
      return -1 !== a.value.toLowerCase().indexOf(c) 
     }, 
     .. etc.. 
    }; 

Sur la base des commentaires pour savoir où ce code a été trouvé, il semble que cela fait partie d'un certain code automatique processus de génération ou de minimisation.

FYI, Javascript n'utilise pas l'expression "tableau associatif". La deuxième déclaration est un objet Javascript.

+0

s'il vous plaît voir @squint commentaire sur la question. Cela éclaire la raison pour laquelle c'est fait comme ça. –

+0

+1 vaut la peine d'avoir un upvote pour votre réponse, ce qui est correct pour le contexte de la question initiale, même si je crois que la bonne réponse doit être attribuée à @squint, parce que sa réponse est correcte en ce qui concerne le précédemment connu) plus grand contexte du code. – Prusprus

7

J'ai trouvé le fichier en question en ligne, et il se trouve qu'il y a une bonne raison à cela. Tout d'abord, il convient de noter que le code dans la question provient d'une source minifiée qui a été indentée.

est ici un morceau de code:

var c=function(){},c={autoSelectFirst:!1,appendTo:"body",serviceUrl:null,lookup:null, 
onSelect:null,width:"auto",minChars:1,maxHeight:300,deferRequestBy:0,params:{}, 
formatResult:g.formatResult,delimiter:null,zIndex:9999,type:"GET",noCache:!1, 
onSearchStart:c,onSearchComplete:c,onSearchError:c, 
// -----------^------------------^---------------^ 

Donc, c'est le code dans la question, mais un peu plus. La chose importante à noter est que la variable c est utilisée dans la création de l'objet littéral, avec onSearchStart:c,onSearchComplete:c,onSearchError:c,.

Quelle est la valeur c affectant dans l'objet? Parce que l'objet est encore en cours de création, cela signifie que c fait toujours référence à la fonction, donc des propriétés comme onSearchStart, qui semblent être des gestionnaires d'événements obtiennent la fonction vide par défaut.

Cela a beaucoup plus de sens.

Pour vérifier, j'ai également trouvé la source originale, non-vérifiée. Voici le code correspondant:

// v---originally it's called `noop` 
var noop = function() { }, 
    that = this, 
    defaults = { 
     autoSelectFirst: false, 
     appendTo: 'body', 
     serviceUrl: null, 
     lookup: null, 
     onSelect: null, 
     width: 'auto', 
     minChars: 1, 
     maxHeight: 300, 
     deferRequestBy: 0, 
     params: {}, 
     formatResult: YithAutocomplete.formatResult, 
     delimiter: null, 
     zIndex: 9999, 
     type: 'GET', 
     noCache: false, 
     onSearchStart: noop, // <---here it's being used 
     onSearchComplete: noop, // <---here it's being used 
     onSearchError: noop, // <---here it's being used 

Il est donc clair maintenant que le noop, qui représente généralement sans opération, a son propre nom et est en effet utilisé dans l'objet créé juste en dessous. En outre, c'est le seulement lieu noop est utilisé dans le fichier entier. Donc apparemment le minifier était assez intelligent pour voir que la variable initialement appelée noop n'allait plus être utilisée, donc il était libre de réutiliser ce nom de variable pour l'objet.Un peu impressionnant d'analyse de code, IMO.

+1

Veuillez modifier la question de l'OP pour voir le reste du code. Comme le code est montré dans la question originale, il n'y a aucun point à la déclaration initiale de 'c' qui est ce que l'autre répond aux adresses. Mais, quand vous ajoutez plus à la question, alors il devient un point. – jfriend00

+0

Ce sont aussi des compétences Google impressionnantes pour trouver ces fichiers;) –

+0

@NelsonTeixeira: J'ai eu de la chance. Google est venu avec un seul résultat quand j'ai utilisé 'filetype: js'. –