Nó tương tự như Python. Lý do khá đơn giản: Bạn không thể thêm điều này, vì nó xung đột với quy tắc phạm vi tìm kiếm mặc định cho các biến không phải cục bộ trong phạm vi bên ngoài. Có thể bằng các ngôn ngữ được gõ tĩnh, vì các thành viên của this
được biết đến tại thời gian biên dịch.
Và những gì nếu làm cho nó một quyết định động, chẳng hạn như "x
đề cập đến this.x
nếu this.x !== undefined
và nếu không vào biến x
" (hoặc bất kỳ quy tắc khác cho việc này được quyết định tại thời gian chạy)? Điều đó rất nguy hiểm, vì nó có thể đổ bóng các biến cục bộ dựa trên những gì this
xảy ra, tức là phá vỡ mã hoàn toàn hợp lệ chỉ cho một số đối tượng nhất định. Một vấn đề khác: Nên undeclaredVar = ...
thêm thuộc tính thể hiện mới? Nếu không, đó sẽ là một sự bất đối xứng xấu xí giữa ẩn và rõ ràng this
. Nếu nó không tạo thuộc tính thể hiện, bạn sẽ mất khả năng đặt biến toàn cầu và đóng từ các hàm bên trong - không quá nhiều mất mát, nhiều người sẽ nói; nhưng các nhà thiết kế JS dường như đã nghĩ khác, vì họ đã chọn phạm vi toàn cầu làm mặc định.
Tạo thuộc tính thể hiện bóng "biến thường" sẽ ít nguy hiểm hơn, nhưng với phạm vi lồng nhau có nhiều tên, bạn sẽ bị buộc phải sử dụng this.
trong hầu hết các trường hợp - vì vậy sẽ ít thắng hơn. Đối với điều này, và/hoặc propably vì lý do khác, các nhà thiết kế coi là một phím tắt infeasible.
Tôi thực sự không biết nhưng tôi đoán đơn giản chỉ để tăng khả năng đọc. Một dự đoán ngẫu nhiên khác là nó có thể giúp tăng tốc mọi thứ trong độ phân giải thay đổi trong một ngôn ngữ thông dịch? – madmik3
có lẽ nó đã được thiết kế để phạm vi toàn cầu có thể được truy cập dễ dàng ngay cả khi có tấn chuỗi nguyên mẫu ?! – kjy112
@ kjy112: Không chỉ toàn cầu - mọi phạm vi bao quanh. Đặc biệt quan trọng với bao đóng. – delnan