Khi bạn gọi obj.method()
trong Javascript, phương pháp được thông qua obj
là this
. Gọi số document.getElementById('x')
do đó đặt this
thành document
.
Tuy nhiên, nếu bạn chỉ viết f = document.getElementById
bạn hiện có tham chiếu mới cho hàm, nhưng tham chiếu đó không còn "bị ràng buộc" với document
nữa.
Vì vậy, mã của bạn không hoạt động vì khi bạn gọi f
làm tên chức năng trần, nó sẽ kết thúc với đối tượng toàn cầu (window
). Ngay khi nội bộ của hàm cố gắng sử dụng this
, nó phát hiện ra rằng nó hiện có một số window
thay vì một số document
và không ngạc nhiên là nó không thích nó.
Bạn thể làm f
làm việc nếu bạn gọi nó như vậy:
var x = f.call(document, 'x');
trong đó kêu gọi f
nhưng rõ ràng thiết lập ngữ cảnh để document
.
Cách khác để sửa lỗi này là sử dụng Function.bind()
mà chỉ có sẵn trong ES5:
var f = document.getElementById.bind(document);
và thực sự chỉ là một cắt ngắn tổng quát để tạo wrapper của riêng bạn mà đặt đúng bối cảnh:
function f(id) {
return document.getElementById(id);
}
Để làm rõ câu trả lời này, 'this' trong' tài liệu .getElementById() 'là' document', trong khi 'this' mà bạn đang thực hiện phạm vi của bạn là phạm vi toàn cục, còn' this' là đối tượng 'window'. –