22

Tôi chỉ chơi đùa với người nghe sự kiện với DOM và javascript và đã nhận thấy điều này:là biến toàn cầu có thể truy cập ở mọi nơi bên trong chuỗi gọi lại?

function chained(msg) { 
    console.log(msg, event); 
} 

function onClick() { 
    chained('the body was clicked'); 
} 

document.body.addEventListener('click', onClick); 

Bây giờ điều buồn cười ... điều này sẽ đầu ra:

"cơ thể được nhấp, (MouseEvent) "

Sau đó, tôi hỏi, tại sao? làm thế nào nó vượt qua đối tượng sự kiện mà không cần gửi nó vào cuộc gọi chained?

function chained(msg) { 
    console.log(msg, namedEventObj); //throw error namedEventObj is not defined 
} 

function onClick(namedEventObj) { 
    console.log(event); //outputs (MouseEvent); 
    console.log(nameEventObj); //outputs (MouseEvent); 
    chained('the body was clicked'); 
} 

document.body.addEventListener('click', onClick); 

Ngay cả Nếu tôi khai báo obj sự kiện được thông qua trên onClick chức năng như namedEventObj nó sẽ chỉ dành cho onClick nhưng không chained chức năng ... Tôi đã này và điều này có ý nghĩa đối với tôi ... nhưng chắc chắn không phải là biến số event để có sẵn cho hàm chained.

Bất kỳ ai biết tại sao nó hoạt động như thế này? Điều duy nhất tôi có thể nghĩ là sự kiện đó là trên thực tế window.event và nó có sẵn khi một số sự kiện gửi đi và Sự kiện ... nhưng điều đó có nghĩa là bất kỳ yếu tố nào cũng có thể nhận được thông tin sự kiện đó nếu được gọi cùng một lúc như sự kiện khi nó kích hoạt?

Tôi đang sử dụng Chrome 11.0.x

+1

[Bạn là đúng ('window.event')] (http://blog.strictly-software.com/2009/10/windowevent-support-cross-browser.html), không biết có gì nhiều hơn để nói về điều đó. Tất nhiên bạn có thể truy cập các biến toàn cầu từ mọi nơi (đó là lý do tại sao chúng là toàn cầu). –

+0

cảm ơn Felix, tôi đồng ý tôi chỉ nghĩ rằng có một chút bối rối khi tạo _ "shortcut" _ bởi vì khi bạn sử dụng 'function (event)' bạn đang nghĩ rằng bạn đang gửi nó chứ không phải nó đã được tự động gửi và don ' t cho ấn tượng rằng nó sẽ lan truyền qua tất cả các chức năng xích. vì vậy tôi tin 'window.event' dễ hiểu như toàn cầu ... nhưng không phải' sự kiện' mà trong hầu hết các trường hợp trùng với tên thuộc tính bạn vượt qua, nhưng điều đó không thể được thực hiện vì mọi thứ đã ở trong cửa sổ. ..và thừa kế: (chỉ cần kiểm tra rằng nó không xảy ra trong Gecko tho, nhưng vẫn tồn tại cho webkit – zanona

+2

Nó có thể gây nhầm lẫn. Nhưng nếu không có tham số hoặc biến trong hàm hiện tại được đặt tên là 'event', bạn biết nó phải đến từ một phạm vi cao hơn (trong trường hợp này là 'window'). Và nếu bạn chuyển nó thành' event', thì bạn thực sự truy cập tham số và không phải 'window.event'. Vậy nó hoạt động như thế nào các hàm hoạt động :) –

Trả lời

25

Người ta có thể truy cập vào các sự kiện hiện tại thông qua window.event. Chỉ cần sử dụng event đang truy cập hoàn toàn window.event.

+25

không nếu bạn đang sử dụng firefox: ( – redgetan

+2

@redgetan Bạn sử dụng sự kiện trong firefox như thế nào? – kendotwill

+0

@kendotwill trình xử lý sự kiện sẽ được chuyển một đối tượng là sự kiện – alxndr

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