2009-12-03 33 views
6

Hãy nhìn vào đoạn mã sau:Đi qua một tham số như một con trỏ trong Javascript

var o; 

(function (p) { 
    p = function() { 
     alert('test'); 
    }; 
})(o); 

o(); // Error: 'o is not a function' 

Trong các chức năng trên, chúng tôi đang tạo ra một chức năng vô danh mà phải mất một tham số, mà tự gọi với một tạo trước đó đối tượng được truyền dưới dạng tham số. Sau đó, tôi đang trỏ đối tượng này đến một hàm (từ bên trong phạm vi mới) và cuối cùng (cố gắng) để gọi nó từ bên ngoài.

Câu hỏi của tôi là, làm thế nào tôi có thể chuyển đối số đó 'bằng cách tham chiếu' để thay đổi con trỏ trỏ đến?

Trả lời

12

Bạn có thể đạt được hiệu quả mong muốn bằng cách tận dụng một thực tế rằng Javascript qua đối tượng bằng cách tham khảo:

var o = { }; 

(function (p) { 
    p.fn = function() { 
     alert('test'); 
    }; 
})(o); 

o.fn(); 
+6

Thực ra, "chuyển bằng tham chiếu" là một chút của một từ khóa sai trong JavaScript. Tương đối so với các ngôn ngữ khác có các loại tham chiếu "đúng", JavaScript không * không * chuyển bất kỳ thứ gì theo tham chiếu. Nó luôn luôn đi theo giá trị. Giá trị đó có thể * giữ * một tham chiếu, đó là những gì tôi nghĩ bạn đang cố gắng nói. –

1

Khi bạn vượt qua trong o biến trong ví dụ của bạn, bạn đang đi qua một giá trị không xác định, không một tham chiếu đến bất cứ điều gì. Những gì bạn cần làm, là gửi các đối tượng cha mẹ. Trong trường hợp này, đối tượng cửa sổ (giả sử bạn đang sử dụng trình duyệt).

(function (p, name) { 
    p[name] = function() { 
     alert('test'); 
    }; 
})(window, "o"); 
o(); 

Điều này chuyển vào đối tượng cửa sổ và tên hàm mới của bạn. Sau đó, nó gán chức năng của bạn cho cửa sổ, và nó bây giờ có sẵn để được gọi. Trừ khi bạn sẽ sử dụng bao đóng, mặc dù, tôi đề nghị chỉ cần chỉ định các chức năng trực tiếp.

function o() { 
    alert('test'); 
}; 
o(); 
3

Bạn nên sử dụng ngôn ngữ như dự định chứ không phải là cố gắng uốn cong nó để phù hợp với các thành ngữ mà chỉ có ý nghĩa trong một ngôn ngữ được xây dựng theo một bộ khác nhau của nguyên tắc này.

var o = (function(p) { 
    return function() { 
     alert('test'); 
    }; 
})(); 

o(); 
+0

Lý do tôi sẽ sử dụng thành ngữ ở trên là vì với điều đó, nếu tôi muốn thay đổi tên của đối tượng chính ('o'), tôi chỉ phải thay đổi nó từ dòng thứ nhất (' var o; ') và từ phần mà tôi chuyển nó như một tham số ('}) (o);'); Tôi sẽ không cần phải thay đổi bất cứ điều gì từ chức năng ẩn danh. –

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