2012-06-12 36 views
5

lý do tại sao hai tập lệnh khác nhau? những gì tôi muốn là kịch bản đầu tiên, nhưng trong drawData thứ hai() nó thay đổi dữ liệu, nó là lạ. bất cứ ai có thể cho tôi biết lý do tại sao nó, và làm thế nào để sửa chữa nó. cảm ơn bạn!Thay đổi mảng trong hàm JavaScript thay đổi mảng bên ngoài hàm?

var data =   ["right"] ; 

function drawData(arrs,type){ 
    if(type=="percentage"){ 
     arrs[0]="omg"; 
    } 
    alert(data[0]); 

} 
drawData(data); 
drawData(data,"percentage"); 

2:

var data =   "right" ; 

function drawData(arrs,type){ 
    if(type=="percentage"){ 
     arrs="omg"; 
    } 
    alert(data); 

} 
drawData(data); 
drawData(data,"percentage"); 
+4

Đó là vì một đối tượng là chính nó. Khi một đối tượng được sửa đổi * đối tượng * được sửa đổi. Khi một giá trị (đối tượng) được chuyển đến một hàm, nó không được sao chép, nhân đôi hoặc nhân bản ** (nội bộ có các kỹ thuật khác nhau được sử dụng, nhưng điều này đúng về ngữ nghĩa). Tức là, chỉ có một mảng - và mảng * cùng * đó được thay đổi bên trong hàm. Nếu bạn muốn có thể thay đổi nó mà không sợ ảnh hưởng đến bên ngoài, hãy tạo một bản sao trước. Đối với một mảng đơn giản, điều này có thể được thực hiện với 'Array.prototype.slice'. Nếu không, các thư viện như jQuery có các phương thức sao chép tiện dụng. –

+0

Ồ, và câu trả lời, ** trước khi bạn nói ** "vượt qua tham chiếu", vui lòng đọc [Chiến lược đánh giá] (http://en.wikipedia.org/wiki/Evaluation_strategy) và tìm cụm từ "tham chiếu" trong [Đặc tả ECMAScript] (http://es5.github.com/) và có thể sao lưu các lựa chọn từ của bạn. Cảm ơn! –

+1

cảm ơn bạn, tôi đã tìm thấy điều gì đó thú vị trong [http://stackoverflow.com/](http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone- a-javascript-object) chỉ cần nhìn vào câu trả lời của John Resig. –

Trả lời

0

biến thể đầu tiên sẽ thay đổi đối tượng thông qua như là tham số để hàm số (mà sẽ xảy ra là mảng) - vì vậy sự thay đổi này được xem bên ngoài chức năng. Biến thể thứ hai gán giá trị mới cho tham số hàm (có nghĩa là tham chiếu đến mảng) nhưng không thay đổi mảng.

+1

Phản hồi quá không rõ ràng/khó hiểu đối với câu hỏi này và sử dụng cụm từ không được xác định: "thay đổi tham chiếu đến mảng này"? Nó cũng kết hợp phạm vi (gán một biến cục bộ) với sự biến đổi đối tượng (gán một thuộc tính trên một đối tượng). –

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