2009-10-27 9 views
2

J'ai une variable nommée age et une fonction nommée AGE. Ignorez le problème que je rencontre avec JScript beindre insensible à la casse pour le moment, c'est-à-dire age (dob) et AGE (dob) ...Pourquoi y a-t-il un conflit entre les variables et les fonctions du même nom dans JScript?

Pourquoi JScript essaie-t-il d'utiliser la variable d'âge comme fonction? Ma meilleure estimation serait que jScript traite la déclaration de fonction à la fois comme déclaration et d'expression ...

 
function AGE(birthDate) { 
    return cmd.Age(birthDate); 
}; 


var age = 32; 
var foo = age; // Error on AGE function 

J'utilise le ScriptControlClass dans une application C# et en utilisant JScript comme un simple langage intégré pour fournir une-simple support expression de complexité à ma base d'utilisateurs ...

+3

JavaScript devient beaucoup plus facile à comprendre si vous arrêtez d'utiliser la syntaxe "function foo() {...}", et commencez à utiliser le formulaire "var foo = function() {...}". Soudain, le fait que les fonctions soient des objets que vous référencez de la même manière que n'importe quoi devient clair, et ouvre un codage de type lambda. – stusmith

+0

Commentaire parfait.^:) – Shire

Répondre

1

Ceci est une syntaxe JavaScript standard, décrite en résumé sur cette page JavaScript tips. Vous devriez jeter un coup d'oeil à une référence JavaScript; beaucoup de gens recommandent JavaScript: The Good Parts, écrit par l'auteur original de JavaScript, mais vous devriez faire votre recherche avant d'acheter un livre.

2

Assurez-vous de ne pas donner une fonction et une variable du même nom. Si vous avez une variable appelée my_cat et une fonction appelée my_cat, JavaScript oubliera ce que la fonction est censée faire ou quelle valeur vous avez stockée dans la variable my_cat. En raison de ce comportement étrange, et parce que les noms de fonctions sont sensibles à la casse, il est logique d'avoir une convention différente pour les fonctions de dénomination que pour nommer les variables.

+0

Je n'ai aucun contrôle sur ce que mes utilisateurs vont essayer, ce qui est la façon dont j'ai couru itno ce problème. Bien sûr, avoir ma fonction dans tous les cas était supposé éviter les conflits ... – Shire

+0

Vos utilisateurs sont maintenant vos développeurs WOOO HOOOO! :) –

+0

Eh bien, mes utilisateurs sont des spécialistes de l'interface de données dont le travail est les données du client propre dans quelque chose de raisonnable à traiter. :) Donc, ils étaient déjà développeurs de partie. C'était en fait leur demande de migrer des expressions XBASE vers JavaScript ... Cependant, la migration est assez moche jusqu'ici ... – Shire

2

En JScript/javascript, les fonctions sont des objets de première classe. Donc, les fonctions sont également des variables que vous pouvez transmettre, réutiliser, remplacer, etc.

Cela devrait expliquer pourquoi vous ne pouvez pas le faire. Sur la ligne avec l'erreur, il n'est pas clair ce que vous attribuez à foo: ce pourrait être l'âge, la variable numérique avec une valeur de 32. Mais ce pourrait aussi être l'âge, la variable de fonction.

Autrement dit, cela est parfaitement légal:

function age(birthDate) { 
    return cmd.Age(birthDate); 
}; 

var d = new Date(); 
var foo = age; 
foo(d); 

et est donc ceci:

function print42() { 
    return 42; 
} 

print42 = function() { 
    return 32; 
} 

print42(); //legal - returns 32 

Si vous êtes inquiet au sujet des conflits évités, vous pouvez essayer de mettre vos fonctions à l'intérieur d'un objet à la place:

var $$MyProjectName = function() { 
    var MyFunctionName = function() { 
     // do something 
    } 

} 

// later 
var $$MyProjectInstance = new $$MyProjectName(); 
$$MyProjectInstance.MyFunctionName(); 

Notez le '$' dans les noms. Il n'y a rien de spécial là-bas. '$' est parfaitement approprié pour un nom d'identifiant, et vous voulez vous assurer que votre nom est unique. Cependant, grâce à jQuery et à d'autres semblables, le «secret» commence à sortir, et vous voulez donc ajouter un petit quelque chose de plus pour garder les choses uniques.