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>
* Đâ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". –
@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
@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