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