Giải thích về những gì đang xảy ra. Câu trả lời của Pointy là tốt nhưng tôi muốn giải thích nó một cách tổng quát hơn. Một nghiên cứu rất tốt trên this
có thể được tìm thấy here
Trình xử lý sự kiện chỉ là một cuộc gọi lại. Bạn vượt qua nó một chức năng và một sự kiện để lắng nghe. Tất cả những gì nó sẽ làm là gọi hàm đó.
Animation.init chỉ là bộ thu gọn cho chức năng đó. Hãy nghĩ về nó như thế này:
var callback = Animation.init
animBtn.addEventListener('click', callback, false);
...
// internal browser event handler
handler() {
// internal handler does stuff
...
// Oh click event happened. Let's call that callback
callback();
}
Vì vậy, tất cả các bạn đã thực hiện được thông qua tại
var callback = function(){
this.doTheMove(); // I'm calling the function here, but it gives an error.
}
Theo mặc định trong javascript this === window
. Điều này sẽ đề cập đến đối tượng toàn cầu nếu nó không được thiết lập cho một cái gì đó. Hiệu ứng ròng là window.doTheMove
được gọi. Và chức năng đó không tồn tại.
Trong trường hợp này kể từ callback
là actaully được gọi bởi trình xử lý sự kiện, các đối tượng DOM đã kích hoạt sự kiện để gọi số node.doTheMove
của bạn vẫn không tồn tại.
Điều bạn muốn làm là bọc nó với tham chiếu đến Hoạt ảnh.
var callback = function() {
Animation.init();
}
Đây là một thực hiện chức năng và nó thực thi init
trên Animation
. Khi bạn thực hiện nó trên một đối tượng như vậy thì nội bộ this === Animation
như bạn mong đợi.
Để tổng hợp. Vấn đề ở đây là Animation.init
chỉ là một tham chiếu đến một hàm. Nó không có thông tin về bất cứ điều gì khác như Pointy đã đề cập.
Câu trả lời của bạn phần lớn là chính xác (hoàn toàn chính xác trong kết quả cuối cùng). Chỉ có sai lầm là * "Hiệu ứng ròng là window.doTheMove được gọi." *. Bởi vì 'init' được chuyển tới' addEventListener', nó thực sự được gọi từ ngữ cảnh của phần tử 'animBtn' để' this.doTheMove() 'có hiệu quả' animBtn.doTheMove() '. Một lần nữa, kết quả cuối cùng là như nhau. Chỉ là một chi tiết nhỏ. – user113716
@patrickdw Cảm ơn tôi đã không chắc chắn liệu 'this' có được chuyển thành đối tượng DOM hay đối tượng Window hay không. Tôi không bận tâm kiểm tra nó để xác nhận. Tôi mong đợi nhiều. – Raynos
+1 Và công bằng, đánh giá của bạn về 'điều này' sẽ đúng nếu nó là 'attachEvent' của Microsoft được sử dụng vì nó không (vì một lý do nào đó) đặt bối cảnh của trình xử lý. – user113716