2010-02-23 42 views
8

nextplease.init = function() {...} là một hàm không có đối số. Tôi mong đợi nextplease.initfunction() {nextplease.init();} để hoạt động giống hệt nhau. Có bất kỳ sự khác biệt nào có thể giữa chúng (rõ ràng, bạn có thể gán một cái gì đó cho nextplease.init, nhưng hãy loại trừ điều đó)? Cụ thể, có thể có sự khác biệt về hành vi giữa window.addEventListener("load", nextplease.init, false);window.addEventListener("load", function() {nextplease.init();}, false);?Giá trị hàm trong JavaScript

Lỗi tôi đang cố gắng tìm được mô tả trong Objects in JavaScript defined and undefined at the same time (in a FireFox extension) Ai đó đã đề xuất rằng sử dụng biểu mẫu đầu tiên thay vì biểu mẫu thứ hai có thể tạo sự khác biệt.

+2

Trên thực tế trong JS ai có thể truy cập vào lập luận của biến 'arguments', vì vậy chúng ta không thể chắc chắn biết bao nhiêu đối số hàm sẽ mất. – kennytm

+0

Đúng, nhưng điều đó không được thực hiện trong trường hợp này. Tôi sẽ cung cấp một liên kết đến mã. –

+1

Thứ hai sẽ tạo ra một bối cảnh thực thi mới, trong đó nextplease.init() sẽ được thực hiện. Do đó, ngăn xếp ngữ cảnh chuỗi/thực thi phạm vi sẽ lớn hơn một. –

Trả lời

4

Một khác biệt quan trọng là giá trị của từ khóa "này" bên trong phần thân của hàm được tham chiếu bởi nextplease.init.

Giả nextplease được định nghĩa như vậy:

nextplease = {}; 
nextplease.someCustomProperty = "hello"; 
nextplease.init = function() { alert(this.someCustomProperty); } 

Trong ví dụ đầu tiên, giá trị của "này" sẽ là đối tượng DOM, và cảnh báo sẽ thất bại:

window.addEventListener("load", nextplease.init, false);  

Trong dạng thứ hai, giá trị của "this" sẽ là đối tượng nextplease và cảnh báo sẽ nói "hello":

window.addEventListener("load", function() {nextplease.init();}, false); 

tham khảo các tài liệu MDC:

https://developer.mozilla.org/en/DOM/element.addEventListener

0

Có 2 sự khác biệt có thể

window.addEventListener("load", nextplease.init, false); 

này sẽ gọi hàm và đó là tất cả. Nếu bạn muốn thêm thông số, thì điều này sẽ không thể đặt chúng.

window.addEventListener("load", function() {nextplease.init();}, false); 

Mặt khác, cho phép bạn gọi nhiều chức năng và cho phép bạn đặt tham số. Nó cũng bổ sung thêm chi phí cho việc gọi hàm, và lưu trữ một hàm trong bộ nhớ.

0

Hai:

window.addEventListener("load", nextplease.init, false); 
window.addEventListener("load", function() {nextplease.init();}, false);? 

gần giống hệt nhau, giả sử nextplease.init được một đối tượng hàm.

Một khác biệt là trong trường hợp thứ hai, bất kỳ đối số nào được truyền cho hàm ngoài (mặc dù chữ ký của nó không xác định bất kỳ, chúng vẫn có thể được chuyển) sẽ không được chuyển đến nextplease.init(). Nhưng vì đây chỉ là thông qua API addEventListener, bạn biết những gì sẽ được thông qua trước thời hạn.

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