2012-07-20 18 views
5

Dato il seguente codice, cosa devo aspettarmi di vedere nell'avviso?Scopo della funzione anonima passato come argomento di funzione

var a = 100; 
function afunc(infunc){ 
    a = 10; 
    infunc.call(); 
} 

afunc(function(){alert(a)}); 

Il mio primo pensiero è stato che il mio browser dovrebbe avvisare il 100 poiché la variabile a = 100 sarebbe di portata per la funzione anonima passata come argomento a afunc. Ma questo presuppone che la funzione anonima sia effettivamente definita nel contesto globale. Apparentemente questo non è il caso in quanto gli avvisi del browser 10. Quindi perché è un = 10 prima di a = 100 nella catena dell'ambito?

Grazie!

risposta

6

Poiché si imposta da un valore a 10 prima di chiamare la funzione anonima. a è infatti globale, ma la stai impostando su 10.

+3

Facepalm! Ora mi sento sciocca. –

+0

sì, è la ragione corretta –

6

Quindi perché è un = 10 prima di a = 100 nella catena dell'ambito?

Non lo è. Hai definito solo la variabile 1 a, che viene semplicemente modificata da 100 a 10 prima di essere avvisata.

Se si desidera che i a s per essere variabili distinte con i propri valori, entrambi hanno bisogno di un var parola chiave:

var a = 100 
function afunc(infunc){ 
    var a = 10; 
    infunc.call(); 
} 

afunc(function(){alert(a)})​ 
1

consideri il seguente esempio:

var a = 100; 

function afunc(infunc){ 
    a = 10; 
    var f = function(){ 
    console.log(a); 
    }; 
    f.call(); 
    infunc.call(); 
} 

afunc(function(){ console.log(a); }); 

Assegniamo un valore di Da 10 a a nell'ambito di afunc e quindi chiamare due funzioni una dopo l'altra che registrano semplicemente il valore di a. In questo caso, ci si aspetterebbe che entrambe le funzioni registrino 10 come valore di a e in effetti ciò che accade.

Nell'esempio, infunc verrà eseguito essenzialmente nello stesso ambito di qualsiasi funzione locale definita in afunc, indipendentemente da dove è stato effettivamente definito. Poiché hai assegnato un valore a a in un ambito più ristretto, è il valore di a quando chiami infunc.

Funzioni fare mantenere una certa portata dalla loro definizione, come nel seguente esempio:

function bfunc(){ 
    var b = 'hello'; 
    return function(){ console.log(b); }; 
} 

afunc(bfunc()); 

Qui, la funzione anonima restituita da bfunc è in realtà chiamato dall'interno del campo di applicazione del afunc, ma è ancora in grado per registrare il valore corretto di b come è stato assegnato nell'ambito originale. Se si dovesse modificare afunc per assegnare un valore diverso a b, verrà comunque registrato "hello" poiché lo b definito in afunc è una variabile diversa da b definita in bfunc.

Problemi correlati