Để thêm một số chi tiết với những gì đang xảy ra ở đây bạn cần phải hiểu chuỗi phạm vi javascript của.
Phạm vi đối tượng
Một đối tượng phạm vi là một đối tượng ẩn tạo ra khi một chức năng được thực thi trên đó các biến khai báo với var
được đặt như tài sản, cũng có tên là function
bên trong hàm thực hiện cũng được đặt như tài sản trên đối tượng phạm vi.
Khi số nhận dạng như mytest
được yêu cầu tìm kiếm javascript cho tên đó được gắn với đối tượng phạm vi hiện tại (btw đối tượng phạm vi còn được gọi là "ngữ cảnh thực thi").
Phạm vi chuỗi
Khi một hàm được khai báo bên trong một hàm đối tượng phạm vi hiện được gắn vào hàm. Khi hàm bên trong này đang thực hiện (và do đó có đối tượng phạm vi riêng của nó), việc thực thi mã có quyền truy cập không chỉ đối tượng phạm vi hiện tại mà còn đối tượng phạm vi mà chức năng hiện đang thực hiện được tạo ra. Dừng ở đây, Đọc lại câu cuối cùng. Điều này được gọi là chuỗi phạm vi , chuỗi sẽ sâu như có các hàm bên trong các hàm (điều này xảy ra rất nhiều khi sử dụng các khung công tác như JQuery).
Do đó khi tìm kiếm số nhận dạng không thành công trên đối tượng phạm vi hiện tại, nó sẽ xem xét đối tượng phạm vi tiếp theo trong chuỗi. Nó tiếp tục đi lên chuỗi cho đến khi nó chạm vào đối tượng toàn cầu (các hàm được khai báo ở mức toàn cục có đối tượng toàn cục như đối tượng phạm vi của chúng).
Sự kiện Thuộc tính weirdness
Khi trình duyệt thực thi mã bên trong văn bản của một thuộc tính như onclick nó đối xử với mã này như thể nó là một hàm. Tuy nhiên các trình duyệt sẽ làm những điều kỳ lạ với chuỗi phạm vi rõ ràng gắn liền với "chức năng" này. Thông thường chúng tiêm phần tử hiện tại và phần tử tài liệu (và có thể các phần tử khác ở giữa) như thể chúng là các đối tượng phạm vi vào trong chuỗi phạm vi.
Ví dụ: thay đổi mã onclick trong ví dụ của bạn thành "alert (href)". Bạn sẽ thấy đường dẫn đến trang của mình theo sau là #
trong hộp cảnh báo. Điều này là do phần tử hiện tại nằm trong chuỗi phạm vi và do đó href
được giải quyết bởi thuộc tính href
của nó.
Trong trường hợp trong câu hỏi, mã đến tại số document
trong chuỗi phạm vi (được đặt phía trên đối tượng cửa sổ chung) và tìm mã định danh "mytest" (tham chiếu đến biểu mẫu) và do đó cố gắng sử dụng giá trị của nó như một hàm (và thất bại).
Tôi đã tìm thấy liên kết này giải thích nó cũng http://oreilly.com/server-administration/excerpts/even-faster-websites/writing-efficient-javascript.html –