2013-08-12 19 views
5

Come mai il codice seguente mi sta dando uno 0 anziché un 1? Voglio che la mia funzione cambi una variabile dichiarata al di fuori della funzione, ma non voglio specificare la variabile nella dichiarazione di funzione.Passaggio di una variabile globale a una funzione

that = 0; 

function go(input) { 
    input++; 
} 

go(that); 

console.log(that); 
+0

offtopic: sempre dichiarare le variabili con 'var'. Oppure, se è una variabile globale, puoi anche impostarli come una proprietà di 'window' (ad es.' Window.that = 0') – Oriol

risposta

10

Come risponde Oriol, non funziona perché la variabile viene passata per valore, quindi non stai cambiando la variabile "that". Una soluzione potrebbe essere quella di passare il nome della variabile:

that = 0; 

function test(input) { 
    window[input]++; 
} 

test("that"); 

console.log(that); // 1 
+0

Stavo cercando un modo per usare window.input senza indicare una variabile chiamata input dichiarata all'esterno della funzione – Emanegux

+1

Penso che sia il più vicino possibile. La funzione di test non ha riferimenti a nessuna variabile, la ottiene semplicemente dal parametro. La tua domanda ha detto "Non voglio specificare la variabile". Altrimenti, dovresti usare un oggetto come gli altri hanno descritto nelle loro risposte. –

7

Questo perché si passa la variabile per valore, non per riferimento.

In javascript, tutte le variabili vengono passate per valore, ad eccezione degli oggetti, che vengono passati per riferimento (beh, infatti sono passati anche per valore ma sono un riferimento, vedi sotto).

E non è possibile modificare questo comportamento.

Modifica: Se non si conosce cosa si intende per valore/riferimento, è necessario leggere un tutorial. Ma qui si dispone di alcuni esempi:

  • variabile passata per valore

    function foo(bar){ 
        console.log(bar); // 1 
        bar++; 
        console.log(bar); // 2 
    } 
    var mybar = 1; 
    console.log(mybar); // 1 
    foo(mybar); 
    console.log(mybar); // 1 
    
  • variabile passata per (valore, ma usato come) di riferimento

    function foo(bar){ 
        console.log(bar.a); // 'b' 
        bar.a = 'c'; 
        console.log(bar.a); // 'c' 
    } 
    var mybar = {a:'b'}; 
    console.log(mybar.a); // 'b' 
    foo(mybar); 
    console.log(mybar.a); // 'c' 
    

Nella tua case

Si può fare

  • Fai la tua variabile una proprietà di un oggetto (nel tuo caso, dal momento che è una variabile globale, utilizzare window) e passare l'oggetto (di riferimento), in modo da poter modificarlo

    window.that = 0; 
    function go(obj) { 
        obj.that++; 
    } 
    go(window); 
    console.log(that); // 1 
    
  • Utilizzare un valore di ritorno

    var that = 0; 
    function go(input) { 
        return input++; 
    } 
    that = go(that); 
    console.log(that); // 1 
    

Nota che non si può fare

  • convertire la vostra variabile in un oggetto

    var that = new Number(0); // Now it's an object number 
    function go(input) { 
        input++; 
    } 
    go(that); 
    that *= 1; // Now it's a literal number 
    console.log(that); // 0 
    

    Questo perché gli oggetti vengono passati per valore troppo, ma sono un punto di riferimento. Ciò significa che all'interno della funzione è possibile modificare le proprietà dell'oggetto esterno (perché è un riferimento) ma non è possibile modificare l'intero oggetto, poiché viene passato per valore.

    si vedano gli esempi qui: https://stackoverflow.com/a/3638034/1529630

+0

Puoi descrivere cosa intendi in maggiore dettaglio? – dezman

+0

Esiste un buon tutorial [qui su snook.ca] (http://snook.ca/archives/javascript/javascript_pass) –

2

Questo ha a che fare con i puntatori, scopo, passando variabili per riferimento, e tutto ciò che il jazz.

Se si vuole veramente fare questo, è possibile passare un oggetto in Javascript come questo:

var that = {value: 0}; 
function go(input) { 
    input.value++; 
} 
go(that); 
console.log(that.value); 

Tutto quello che abbiamo fatto è fatto che un oggetto che è, per definizione, passato come un punto di riferimento in Javascript. Quindi ci assicuriamo di modificare correttamente gli attributi dell'oggetto.

1

Il codice

 
that = 0; //Global variable 

function go(input) { //input is argument and is not passed by reference 
    input++; //This just increments a local copy i.e 0 
} 

go(that); //Passed 0 

console.log(that); 

Invece fare questo

 
that = 0; 

function go() { 
    that++; 
} 

go(); //Not passing any variable .. function can already see the gloabl "that" 

console.log(that); // This will print gloabl i.e. 1 

+0

Non so se seguo. In che modo l'input ++ cambierà la variabile se non è stata dichiarata? – Emanegux

+0

Oops era un refuso ... ora è chiaro grazie a @Emanegux :) – woofmeow

Problemi correlati