2010-09-14 34 views
6

Sự hiểu biết của tôi: trong đối tượng Javascript và mảng được chuyển thành tham chiếu không phải là giá trị cho đối số hàm. Một nhóm jQuery là một đối tượng và do đó nên được chuyển thành tham chiếu.Đối tượng jQuery được truyền làm đối số cho hàm là giá trị sao chép không tham chiếu?

Tuy nhiên, tôi đang tìm trong kịch bản thử nghiệm bên dưới có điều gì đó kỳ lạ đang diễn ra; nhóm jQuery hoạt động như một giá trị không phải là một tham chiếu trừ khi được bọc trong một đối tượng khác ... bất cứ ai có thể giải thích điều này?

<html> 
<head> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
</head> 
<body> 
<script> 

function test(arg){ 
    arg = arg.add($('<span/>')) 
    console.log(arg); 
}; 

ele = $('<div/>'); 
test(ele); // div + span in the group as expected 
console.log(ele); // only the div - the 'arg' param in function was a copy 

function test2(arg){ 
    arg.a = arg.a.add($('<span/>')); 
    console.log(arg.a); 
}; 

obj = {a:ele}; 
test2(obj); // div + span in the group as expected 
console.log(obj.a); // both in the group - arg acted like a reference! 

</script> 
</body> 
</html> 

Trả lời

3

Đây là "tính năng" của phương pháp .add(). Nó không sửa đổi đối tượng jQuery ban đầu, mà là trả về một đối tượng mới có giá trị gia tăng.

Ví dụ đầu tiên của bạn, bạn cần phải trả về biến số arg và ghi đè ele.

function test(arg){ 
    arg = arg.add($('<span/>')) 
    console.log(arg); 
    return arg; // return the new jQuery object stored in "arg" 
}; 

ele = $('<div/>'); 
ele = test(ele); // overwrite the original "ele" with the returned value 
console.log(ele); 

EDIT: Để cung cấp cho minh họa khác, sử dụng mã của bạn, nhưng với .push() làm biến đổi các đối tượng ban đầu, bạn sẽ thấy giá trị chính xác được cập nhật trong ele.

function test(arg){ 
    arg = arg.push($('<span/>')[0]) 
    console.log(arg); // Because .push() is being used, "arg" will reference 
         // the new length of the array. 
}; 

ele = $('<div/>'); 
test(ele); 
console.log(ele); // Will reference jQuery object with both elements 

EDIT: Sau khi minh họa cuối cùng. Bởi vì .add() trả về một đối tượng mới, bạn có thể cập nhật cả hai biến để trỏ đến giá trị tương tự như thế này:

ele = arg = arg.add($('<span/>')); 

Bây giờ thay vì ele tham khảo bản gốc, và arg tham khảo đối tượng mới được tạo ra, cả hai biến tổ chức một tham chiếu đến cùng một đối tượng trong bộ nhớ.

+1

* Đây là một "tính năng" của phương thức .add(). * - làm cho nó có vẻ giống như phương pháp khác nếu nó được mã hóa như vậy. Thực tế là, một giá trị mới được đặt thành biến 'arg' trong hàm và nó không sửa đổi biến' ele' trong phạm vi bên ngoài mà OP cho rằng đã được chuyển vào "bằng tham chiếu". –

+0

@Andy E - Thực ra điều đó là có thể. Tôi sẽ đưa ra một ví dụ khác bằng cách sử dụng mã ban đầu của OP, nhưng thay vào đó với 'push()'. Nó sửa đổi một cách chính xác đối tượng jQuery và các tham chiếu 'ele' đã thay đổi đối tượng. – user113716

+0

@Andy E - Ok, có thể tôi hiểu sai ý nghĩa chính xác của * "truyền bằng tham chiếu" *. Khi bạn chuyển một biến, bạn chuyển một tham chiếu đến giá trị của nó, mà tôi tin rằng cùng một thứ mà bạn sẽ thấy trong các ngôn ngữ hướng đối tượng khác như Java chẳng hạn. Tôi có nhầm không? Trong mọi trường hợp, cả hai giải pháp minh họa các khái niệm thích hợp trong javascript. – user113716

0

Hai thử nghiệm bạn đã thực hiện không giống nhau. Người đầu tiên đặt một biến là arg thành giá trị arg.add(...), trong khi bộ thứ hai là thuộc tính trên arg có tên a với giá trị arg.a.add(...). Việc chuyển "bằng tham chiếu" trong JavaScript không thực sự giống với ngôn ngữ khác (trên thực tế, một số sẽ không đồng ý rằng nó thực sự là tham chiếu). Khi bạn chuyển một biến có kiểu là một đối tượng, bạn có một tham chiếu đến giá trị của nó chứ không phải biến ban đầu.

Khi bạn đặt arg = arg.add(...), bạn đang đặt giá trị mới cho biến số arg và ghi đè giá trị trước đó của nó. Điều này sẽ không sửa đổi biến được truyền vào, bởi vì bạn không có tham chiếu đến nó, bạn chỉ có một tham chiếu đến giá trị của nó (đối tượng).

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