2012-06-08 27 views
9

Có đúng là trong các hàm JavaScript trả về các đối tượng khác ngoài Boolean và Numbers bằng cách tham chiếu?Trả lại bằng cách tham chiếu trong JavaScript?

Làm thế nào điều này có thể xảy ra khi các đối tượng đó bị phá hủy khi chức năng mà chúng thuộc về chấm dứt?

+0

Javascript không phải là C. – doug65536

Trả lời

17

Đối tượng không bị hủy cho đến khi tất cả các tham chiếu đều bị mất và thu thập rác. Khi đối tượng được trả về, mã gọi sẽ nhận được một tham chiếu đến nó, và đối tượng không phải là rác được thu thập.

Về mặt kỹ thuật, khung ngăn xếp của hàm được gọi bị hủy khi trả về. Các đối tượng, tuy nhiên, không phải là trên ngăn xếp, nhưng trên đống. Tham chiếu cục bộ của hàm cho đối tượng nằm trên ngăn xếp, và do đó bị phá hủy, nhưng tham chiếu của mã gọi không bị phá hủy cho đến một thời gian sau đó.

Như một lưu ý phụ, nó không thực sự quan trọng như thế nào nó được trả lại, bởi vì các chức năng không thể sử dụng các đối tượng anyway sau khi nó trở về.

+0

Bản ghi kích hoạt có thể tồn tại khi hàm trả về, nếu hàm ảnh hưởng phạm vi bên ngoài của nó theo cách như vậy để hiển thị tham chiếu đến nó. Tức là, nếu một hàm khởi tạo một hàm và hàm đó tham chiếu đến phạm vi cục bộ (bản ghi kích hoạt hoặc "khung ngăn xếp" - mà nó thực sự không), và hàm đó được trả về hoặc gán cho một số biến tương đối toàn cầu hoặc tài sản, sau đó bản ghi kích hoạt vẫn có sẵn và không được thu thập. – Pointy

8

Có đúng là trong các hàm JavaScript trả về các đối tượng khác ngoài Boolean và Numbers bằng tham chiếu không?

Đúng là, các đối tượng trong JavaScript là luôn thông qua tham khảo

Làm thế nào là nó có thể khi các đối tượng bị phá hủy khi hàm những thuộc về chấm dứt?

Chỉ các tham chiếu bị hủy, chứ không phải chính các giá trị đó. Và miễn là không có tài liệu tham khảo còn lại, đối tượng là một ứng cử viên được thu gom rác thải.

6

Hai câu trả lời tốt nhất ở đó, nhưng chỉ cần nghĩ mình nên nói thêm rằng thật dễ dàng để kiểm tra:

function modify(arg) { 
    arg.modified = true; 
} 
test = 4; 
modify(test); 
console.log(test.modified); // undefined 
test = {}; 
modify(test); 
console.log(test.modified); // true 
test = ""; 
modify(test); 
console.log(test.modified); // undefined 

nơi không xác định có nghĩa là nó đã được sao chép thay vì được thông qua tham khảo. Lưu ý rằng các chuỗi không được chuyển qua tham chiếu.

2

Đối số (bao gồm cả đối tượng) được gửi đến hàm theo giá trị. Thuộc tính của đối tượng đối số có sẵn và có thể thay đổi hoạt động như tham chiếu. Hãy xem ví dụ bên dưới:

function changeObj(obj){obj.a *= 10; return true;} 
function killObj(obj){obj = null; return true;} 
function changeAndKillObj(obj){obj.a += 1; obj = null; return true;} 
var a = {a:1, b:'test'}; 
console.log(a); //Object {a:1, b:'test'} 
changeObj(a); 
console.log(a); //Object {a:10, b:'test'} 
killObj(a); 
console.log(a); //Object {a:10, b:'test'} 
changeAndKillObj(a); //Object {a:11, b:'test'} 

Bottom line: Bạn có thể làm bất cứ điều gì bạn muốn với thuộc tính của đối tượng nhưng không phải với đối tượng. Bất kỳ phép gán nào cho đối số làm cho nó trở thành đối tượng khác và hủy liên kết khỏi đối tượng ban đầu.

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