Đó là vì bạn đang chuyển biến theo giá trị, không phải bằng tham chiếu. Trong javascript, tất cả các biến được truyền theo giá trị, ngoại trừ các đối tượng, được chuyển qua tham chiếu (tốt, trên thực tế chúng được truyền theo giá trị quá nhưng chúng là tham chiếu, xem bên dưới).
Và bạn không thể thay đổi hành vi đó.
Chỉnh sửa: Nếu bạn không biết những gì đi qua giá trị/phương tiện tham chiếu, bạn nên đọc hướng dẫn. Nhưng ở đây bạn có một số ví dụ:
Biến truyền theo giá trị
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
biến đi ngang qua (giá trị nhưng sử dụng như một) tài liệu tham khảo
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'
Trong của bạn trường hợp
Bạn có thể làm
Hãy biến của bạn một tài sản của một đối tượng (trong trường hợp của bạn, vì đó là một biến toàn cầu, sử dụng window
) và vượt qua các đối tượng (tham khảo), vì vậy bạn có thể thay đổi nó
window.that = 0;
function go(obj) {
obj.that++;
}
go(window);
console.log(that); // 1
Sử dụng một giá trị trả về
var that = 0;
function go(input) {
return input++;
}
that = go(that);
console.log(that); // 1
Lưu ý rằng bạn không thể làm
Chuyển đổi biến bạn thành một đối tượng
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
Đó là bởi vì các đối tượng được truyền theo giá trị quá, nhưng họ là một tài liệu tham khảo. Điều đó có nghĩa là bên trong hàm bạn có thể thay đổi các thuộc tính của đối tượng bên ngoài (vì nó là một tham chiếu) nhưng bạn không thể thay đổi toàn bộ đối tượng, bởi vì nó được truyền theo giá trị.
Xem ví dụ ở đây: https://stackoverflow.com/a/3638034/1529630
Offtopic: Luôn luôn khai báo các biến của bạn với 'var'. Hoặc, nếu đó là biến toàn cầu, bạn cũng có thể đặt chúng làm thuộc tính của 'cửa sổ' (ví dụ:' window.that = 0') – Oriol