2017-04-17 6 views
0

Je préface en disant que je sais que l'utilisation de with est fortement déconseillée, et je n'ai pas l'intention de l'utiliser non plus. Je suis juste curieux d'apprendre comment cela fonctionne (j'essaie de comprendre la portée en javascript).Déclarations de variables dans un bloc avec

Si j'ai un code comme ceci:

function foo(obj) { 
    with (obj) { 
     b = 2; 
    } 
} 

var o1 = { 
    a: "something" 
}; 

foo(o1); 
console.log(o1.b) // This outputs undefined (makes sense) 
console.log(b) // This outputs 2 (makes sense) 

Cependant, si je change foo à quelque chose comme ceci:

function foo(obj) { 
    with (obj) { 
     var b = 2; // I use var b instead of b 
    } 
} 

Lorsque je passe o1 à toto, encore une fois, o1 n'a pas attribut b. Pourquoi est-ce? Je pensais que l'utilisation de var déclarerait b dans la portée de obj, donc l'attribut serait créé à l'intérieur de o1 au lieu de dans la portée globale.

Répondre

2

var déclarations sont hissées. Donc ce que vous exécutiez équivaut à

function foo(obj) { 
    var b; 
    with (obj) { 
     b = 2; 
    } 
} 

Il n'a pas d'importance que la déclaration est à l'intérieur d'un bloc with. §9.2.12 décrit ce qui se passe lorsque le corps de la fonction est évalué. A l'étape 11/12, toutes les déclarations de variables sont collectées. Une instruction with "transmet" simplement toutes les déclarations à l'intérieur de celle-ci (see spec).

1

Les déclarations de variable (utilisant var) ne respectent pas l'étendue du bloc et sont remplacées par hoisted au début de la portée. En ce qui concerne le compilateur/interprète, votre code est en réalité:

function foo(obj) { 
    var b = undefined; 
    with (obj) { 
     b = 2; 
    } 
}