2013-01-17 10 views
13

Dire che ho questa funzione anonima:JavaScript: le variabili di accesso all'interno funzione anonima dall'esterno

(function(window){ 

var private = 'private msg'; 

function sayit() { 
    alert(private) // works 
} 

document.body.onclick = sayit; // works 

})(window); 

// private shouldn't be accessible here 

È così che dovrebbe comportarsi JavaScript?

Cioè, non c'è modo di accedere a private da qualsiasi luogo al di fuori di tale funzione anonima?

Se è così, è possibile trovare qualche tipo di hack per accedere a private dall'esterno, lasciando il codice così com'è?

+0

Non senza cambiare il codice. – Blender

+0

Le variabili private sono intese per essere private ... perché dovresti accedere a una variabile privata dall'esterno? – rexcfnghk

+0

@ rexcfnghk - non è così tanto. è uno di quei momenti in cui "questo è solo perché è così che funziona" –

risposta

9

Sì, questo è il modo in cui Javascript consente di avere variabili "private" (nascoste nell'ambito di una funzione).

No, non è disponibile alcuna modifica per accedere a variabili come private senza riscrivere il codice.

Le variabili definite con var all'interno di una funzione sono accessibili solo all'interno di tale funzione.

-1

Si dovrebbe fare qualcosa di simile:

var Test = (function(window){ 
var private = 'private msg'; 
var api = {}; 

function sayit(){ 
    alert(private) // works 
} 
document.body.onclick = sayit; // works 

api.sayit = sayit; 
return api; 
})(window); 

Test.sayit(); //this would alert 'private msg' 
0

Questo è il punto di avere portata e variabili private

In entrambi i

impostare il valore privato a una variabile globale?

o

dichiarare la variabile fuori

6

Ok. Capito.

(function(window){ 
    var alert_original = window.alert; 
    window.alert = function(data) { 
     window.extracted = data; 
     alert_original(data); 
    }; 
})(window); 

(function(window){ 
    var private = 'private msg'; 
    function sayit() { 
    alert(private) // works 
} 
document.body.onclick = sayit; // works 
})(window); 

Dopo aver fatto clic del corpo, è possibile ottenere 'msg privato' dal extracted

+0

Intelligente. Solo, non puoi * cambiare * il valore di 'private', quindi quello che hai è 'accesso' di sola lettura. – Faiz

+0

@Faiz Hai ragione. Forse non c'è modo di "accedere". –

+0

@SangYeobBonoYu lol! – neoDev

1

Esse non sono intese come variabili "privati"; è così che funzionano le chiusure. Puoi fare la stessa cosa in Perl e Python, per lo meno, e probabilmente in moltissimi altri linguaggi con chiusure e scope lessicale.

I debugger come Firebug o Chrome Inspector possono comunque mostrare l'intero stack in qualsiasi momento (comprese le variabili chiuse), ma a parte questo e senza modificare il codice originale, penso che tu sia sfortunato.

Forse se ci hai detto il tuo problema reale ... :)

+0

La chiusura == funzione anonima? – steve

+0

@barjonah: sono correlati ma non uguali. È facile formare una chiusura con la dichiarazione di funzioni anonime.Una chiusura si forma quando una funzione anonima (o anche una funzione nidificata o regolare) fa riferimento a variabili nel suo ambito genitore. Quindi una funzione anonima è un modo per creare una chiusura. – Faiz

+0

non posso fare a meno di sentire che ho [risposto prima] (http://stackoverflow.com/a/150185/17875) :) ma Faiz è corretto, sì. – Eevee

Problemi correlati