2013-08-12 11 views
5

Wie kommt der folgende Code gibt mir eine 0 statt einer 1? Ich möchte, dass meine Funktion eine außerhalb der Funktion deklarierte Variable ändert, aber ich möchte die Variable nicht in der Funktionsdeklaration angeben.10 Übergeben einer globalen Variablen an eine Funktion

that = 0; 

function go(input) { 
    input++; 
} 

go(that); 

console.log(that); 
+0

Offtopic: Immer Ihre Variablen mit 'var' erklären. Oder, wenn es eine globale Variable ist, können Sie sie auch als eine Eigenschaft von 'window' festlegen (z. B.' window.that = 0') – Oriol

Antwort

10

Wie von Oriol beantwortet, funktioniert es nicht, weil die Variable von Wert übergeben wird, also ändern Sie nicht die Variable "das". Eine Abhilfe wäre den Variablennamen weitergeben müssen:

that = 0; 

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

test("that"); 

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

Ich suchte nach einer Möglichkeit, window.input zu verwenden, ohne eine Variable namens Eingabe außerhalb der Funktion deklariert – Emanegux

+1

Ich denke, das ist der nächste, den du gehen kannst. Die Testfunktion hat keinen Bezug zu einer Variablen, sie erhält sie nur aus dem Parameter. Ihre Frage lautete: "Ich möchte die Variable nicht angeben". Andernfalls müssten Sie ein Objekt verwenden, wie es andere in ihren Antworten beschrieben haben. –

7

Das liegt daran, dass Sie die Variable nach Wert übergeben, nicht durch Referenz.

In Javascript werden alle Variablen nach Wert übergeben, ausgenommen Objekte, die als Referenz übergeben werden (naja, sie werden auch als Wert übergeben, aber sie sind eine Referenz, siehe unten).

Und Sie können dieses Verhalten nicht ändern.

Bearbeiten: Wenn Sie nicht wissen, was nach Wert/Referenz bedeutet, sollten Sie ein Tutorial lesen. Aber hier haben Sie einige Beispiele:

  • Variable von Wert übergeben

    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 
    
  • Variable vorbeikam (Wert, sondern verwendet als) Referenz

    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' 
    

In Ihrem Fall

können Sie tun

  • Ihre Variable eine Eigenschaft eines Objekts Stellen (in Ihrem Fall, da es eine globale Variable verwenden window) und das Objekt (Referenz) übergeben, so dass Sie es

    verändern können
    window.that = 0; 
    function go(obj) { 
        obj.that++; 
    } 
    go(window); 
    console.log(that); // 1 
    
  • Verwenden ein Rückgabewert

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

Beachten Sie, dass Sie nicht

  • Konvertieren Sie Ihre Variable in ein Objekt

    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 
    

    Das ist, weil Objekte von Wert tun zu übergeben, aber sie sind eine Referenz. Das bedeutet, dass Sie innerhalb der Funktion die Eigenschaften des äußeren Objekts ändern können (weil es eine Referenz ist), aber Sie können das gesamte Objekt nicht ändern, da es nach Wert übergeben wird.

    Siehe Beispiele hier: https://stackoverflow.com/a/3638034/1529630

+0

Können Sie beschreiben, was Sie genauer meinen? – dezman

+0

Es gibt ein gutes Tutorial [hier bei snook.ca] (http://snook.ca/archives/javascript/javascript_pass) –

2

Dies hat mit Zeigern zu tun, Umfang, Variablen durch Verweis vorbei, und alles, was Jazz.

Wenn Sie das wirklich tun möchten, können Sie ein Objekt in Javascript wie dies passieren kann:

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

Alles, was wir getan haben gemacht wird, dass ein Objekt, das per Definition als Referenz übergeben wird, in Javascript. Dann stellen wir nur sicher, dass wir die Attribute des Objekts richtig ändern.

1

Ihr Code

 
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); 

Statt dies tun

 
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

Nicht sicher, ob ich folge. Wie wird input ++ die Variable ändern, wenn sie nicht deklariert wurde? – Emanegux

+0

Oops war ein Tippfehler ... jetzt ist es klar danke @Emanegux :) – woofmeow

Verwandte Themen