Cách truyền biến tham chiếu trong Javascript?

Truyền biến tham chiếu hầu như ngôn ngữ nào cũng có, vậy trong Javascript có tồn tại hay không? Nếu có thì cách sử dụng nó như thế nào? Hãy trình bày cách sử dụng tham chiếu trong Javascript.

Bài giải

-------------------- ######## --------------------

Trong Javascript cho phép bạn truyền bao nhiêu tham số vào hàm đều được miễn là hàm đó có khai báo tham số, các tham số này được xử lý trong hàm và mang tính cục bộ, nghĩa là các thao tác bên trong hàm không làm ảnh hưởng đến giá trị các tham số đó.

1. Một số cách truyền tham số trong hàm

Tham số có thể hiểu là một nặc danh đại diện cho giá trị truyền vào hàm, vì vậy ta có thể truyền bất kì một kiểu dữ liệu nào cho tham số như kiểu number, string, object, hay thậm chí là một callback function. Ok vậy thì trong phần này mình sẽ lấy một số ví dụ cho từng kiểu dữ liệu nhé.

Khi tham số là kiểu dữ liệu thông thường

Kiểu dữ liệu thông thường là kiểu dữ liệu number, string, ... Mình sẽ làm một ví dụ đơn giản như sau: tạo một hàm với nội dung thay đổi giá trị của tham số, sau đó sử dụng để kiểm tra xem giá trị của tham số đó ở bên ngoài hàm có bị ảnh hưởng theo không. 

function changeValue(x)
{
    // đổi giá trị của x
    x = 5;
}

var x = 4;
alert(x); // kết quả là 4
myfunction(x); // chạy hàm này xem x có bị thay đổi không
alert(x); // kết quả x vẫn không thay đổi (vẫn bằng 4)

Rõ ràng giá trị của x ở bên ngoài hàm vẫn không thay đổi, đây chính là đặc điểm của tham số truyền vào hàm.

Khi tham số là một Object

Trong ví dụ trên tham số truyền vào có kiểu dữ liệu number nên rất đơn giản, bây giờ ta thử truyền tham số là một object xem kết quả thế nào nhé. Xét ví dụ dưới đây:

function changeValue(obj)
{
    obj.value = 20;
}
var obj = {};

console.log(obj); // obj có giá trị rỗng {}

changeValue(obj);

console.log(obj); // obj có giá trji là {value:20}

Trong ví dụ này sau khi thực hiện gọi hàm changeValue thì đối tượng obj đã được bổ sung một key value, tức là nó đã thay đổi giá trị. Vậy ta có kết luận là nếu tham số truyền vào là một object thì các thao tác thay đổi giá trị của object bên trong hàm sẽ được lưu lại.

Khi tham số là function

Nếu bạn truyền vào là một function thì sau khi thực hiện function đó vẫn không thay đổi.

Xét ví dụ sau: XEM DEMO

// Hàm chính
function freetutsDotNet()
{
    this.age = 3;

    this.add = function(){
            this.age++;
    };
}

// Tạo mới đối tượng domain
var domain = new freetutsDotNet();

// Hàm thực hiện callback function
function domainChanger(fnc){
        fnc();
}

//// SỬ DỤNG ////
alert(domain.age); // kết quả là 3

domainChanger(domain.add); // gọi hàm domain.add với mục đích tăng age lên 4
alert(domain.age); // nhưng kết quả vẫn là số 3

Trong ví dụ này mình đã truyền tham số là một callback function và callback function đó có tác dụng tăng age lên 1, tuy nhiên sau khi thực hiện xong thì age vẫn giữ nguyên giá trị là 3.

2. Kết luận

Như vậy trong Javascript không tồn tại khái niệm truyền tham chiếu, vì vậy bạn chỉ có thể sử dụng biến cục bộ hoặc là object thì các hành động bên trong hàm mới làm thay đổi giá trị của biến.

Nguồn: freetuts.net