2013-08-12 24 views
5

Jak to się stało, że poniższy kod daje mi 0 zamiast 1? Chcę, aby moja funkcja zmieniała zmienną zadeklarowaną poza funkcją, ale nie chcę określać zmiennej w deklaracji funkcji.Przekazywanie zmiennej globalnej do funkcji

that = 0; 

function go(input) { 
    input++; 
} 

go(that); 

console.log(that); 
+0

Offtopic: Zawsze zadeklarować zmienne z 'var'. Lub, jeśli jest to zmienna globalna, możesz również ustawić je jako właściwość 'okna' (np.' Window.that = 0') – Oriol

Odpowiedz

10

Jak odpowiedział Oriol, nie działa, ponieważ zmienna jest przekazywana przez wartość, więc nie zmieniasz zmiennej "that". Rozwiązaniem byłoby podać nazwę zmiennej:

that = 0; 

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

test("that"); 

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

Szukałem sposobu użycia window.input bez znaczenia zmienna o nazwie input zadeklarowana poza funkcją – Emanegux

+1

Myślę, że to jest najbliższe, co możesz zrobić. Funkcja testowa nie ma odniesienia do żadnej zmiennej, po prostu pobiera ją z parametru. Twoje pytanie brzmiało "Nie chcę określać zmiennej". W przeciwnym razie musiałbyś użyć obiektu, który inni opisali w swoich odpowiedziach. –

7

To dlatego, że przekazujesz zmienną przez wartość, a nie przez odniesienie.

W javascript, wszystkie zmienne są przekazywane przez wartość, z wyjątkiem obiektów, które są przekazywane przez odniesienie (cóż, w rzeczywistości są one przekazywane również przez wartość, ale są odniesieniem, patrz poniżej).

Nie można zmienić tego zachowania.

Edytuj: Jeśli nie wiesz, co oznacza wartość/środki odniesienia, powinieneś przeczytać samouczek. Ale tu masz kilka przykładów:

  • Zmienne przekazywane przez wartość

    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 
    
  • Zmienna przekazywana przez (wartość, ale używane jako a) Odniesienie

    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' 
    

w twojej sprawa

Można zrobić

  • Dodać zmienna właściwość obiektu (w przypadku, ponieważ jest to zmienna globalna, należy window) i przekazać obiekt (odniesienia), dzięki czemu można zmieniać jej

    window.that = 0; 
    function go(obj) { 
        obj.that++; 
    } 
    go(window); 
    console.log(that); // 1 
    
  • Zastosowanie wartość powrotu

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

Należy pamiętać, że nie można zrobić

  • Konwersja zmiennej do obiektu

    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 
    

    to dlatego, że obiekty są przekazywane przez wartość zbyt, ale są one odniesienie. Oznacza to, że wewnątrz funkcji można zmienić właściwości obiektu zewnętrznego (ponieważ jest to odniesienie), ale nie można zmienić całego obiektu, ponieważ jest on przekazywany wartością.

    Zobacz przykłady tutaj: https://stackoverflow.com/a/3638034/1529630

+0

Czy możesz opisać, co masz na myśli bardziej szczegółowo? – dezman

+0

Istnieje dobry tutorial [tutaj na snook.ca] (http://snook.ca/archives/javascript/javascript_pass) –

2

Ma to związek ze wskaźnikami, zakres, przechodząc przez odniesienie zmiennych, a wszystko to jazz.

Jeśli naprawdę chcesz to zrobić, można przekazać obiekt w JavaScript tak:

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

Wszystko zrobiliśmy składa że przedmiot, który z definicji jest przekazywana jako punkt odniesienia w JavaScript. Następnie upewniamy się, że właściwie modyfikujemy atrybuty obiektu.

1

Kod

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

Zamiast robić to

 
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

Nie jestem pewien, czy podążam. W jaki sposób input ++ zmieni zmienną, jeśli nie została zadeklarowana? – Emanegux

+0

Ups był literówka ... teraz jasne dzięki @Emanegux :) – woofmeow

Powiązane problemy