2013-08-12 86 views
5

Mã sau đây cho tôi số 0 thay vì 1 bằng cách nào? Tôi muốn chức năng của tôi thay đổi một biến được khai báo bên ngoài hàm nhưng tôi không muốn chỉ định biến trong khai báo hàm.Truyền biến số toàn cục sang hàm

that = 0; 

function go(input) { 
    input++; 
} 

go(that); 

console.log(that); 
+0

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

Trả lời

10

Như được trả lời bởi Oriol, nó không hoạt động vì biến được truyền theo giá trị, vì vậy bạn không thay đổi biến "đó". Một cách giải quyết sẽ được thông qua tên biến:

that = 0; 

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

test("that"); 

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

Tôi đang tìm cách sử dụng window.input mà không có nghĩa là một biến được gọi là đầu vào được khai báo bên ngoài hàm – Emanegux

+1

Tôi nghĩ rằng đó là gần nhất bạn có thể đi. Hàm test không có tham chiếu đến bất kỳ biến nào, nó chỉ lấy nó từ tham số. Câu hỏi của bạn nói "Tôi không muốn chỉ định biến". Nếu không, bạn sẽ phải sử dụng một đối tượng như những người khác đã mô tả trong câu trả lời của họ. –

7

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

+0

Bạn có thể mô tả ý nghĩa của mình chi tiết hơn không? – dezman

+0

Có một hướng dẫn tốt [ở đây tại snook.ca] (http://snook.ca/archives/javascript/javascript_pass) –

2

này đã làm với con trỏ, phạm vi, đi qua các biến bằng cách tham chiếu, và tất cả những gì jazz.

Nếu bạn thực sự muốn làm điều này, bạn có thể vượt qua một đối tượng trong Javascript như thế này:

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

Tất cả chúng tôi đã làm được làm rằng một đối tượng mà là theo định nghĩa thông qua như là một tài liệu tham khảo trong Javascript. Sau đó, chúng tôi chỉ đảm bảo rằng chúng tôi sửa đổi đúng các thuộc tính của đối tượng.

1

Mã của bạn

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

Thay vì làm điều này

 
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

Không chắc chắn nếu tôi làm theo. Làm thế nào sẽ đầu vào ++ thay đổi biến nếu nó chưa được khai báo? – Emanegux

+0

Rất tiếc, đã xảy ra lỗi đánh máy ... bây giờ cảm ơn rõ ràng @Emanegux :) – woofmeow

Các vấn đề liên quan