2017-01-06 1 views
2

Est-il possible de modifier la portée lexicale de javascript afin que les fonctions utilisent la portée variable qui est en vigueur lorsqu'elles sont évoquées et non lorsqu'elles ont été définies? En un mot, puis-je changer la chaîne de portée associée à une fonction?désactiver le scannage lexical en javascript

Un exemple pour cela: Je voudrais être en mesure d'exécuter quelque chose comme ça sans faire passer le message d'erreur, que y est pas défini:

function f(){y+2}; 
function g(){ 
var y=2; 
f(); 
return y; 
} 
g(); 
+1

Il y a une chose à cela: les arguments. –

+1

'Fonction f (y) {return (y + 2)};' et change son appel en conséquence. –

+0

Mis à part l'utilisation de 'eval', non. Pourquoi ressens-tu ce besoin? –

Répondre

0

Votre question peut être dû à l'incompréhension de votre problème. y n'est pas défini dans une portée fonctionnelle de f() et vous ne lui attribuez jamais de valeur. Le y dans g() est étendu à cette fonction.

Dans votre exemple:

function f(){ y+2 }; 
function g(){ 
    var y=2; 
    f(); 
    return y; 
} 
g(); 

Si g() utilisé le y global, puis y dans f() seront définis lors de l'exécution. Supprimez le mot-clé var dans g() pour créer un y global lors de la compilation.

function f(){ y+2 }; 
function g(){ 
    y=2; 
    f(); 
    return y; 
} 
g(); 

REMARQUE: globalement cette SCOPED Création comme variable est possible, mais pas recommandé. Puisque votre exemple est artificiel et seulement utilisé pour comprendre la portée, il ne blessera rien.