Hướng dẫn explain this keyword in javascript - giải thích từ khóa này bằng javascript
Từ khóa ____22 của một hàm hoạt động khác một chút trong JavaScript so với các ngôn ngữ khác. Nó cũng có một số khác biệt giữa chế độ nghiêm ngặt và chế độ không nghiêm ngặt.function's Trong hầu hết các trường hợp, giá trị của Thử nóCú phápGiá trịMột thuộc tính của bối cảnh thực thi (toàn cầu, chức năng hoặc eval), trong chế độ không đóng cửa, luôn luôn là một tham chiếu đến một đối tượng và trong chế độ nghiêm ngặt có thể là bất kỳ giá trị nào. Sự mô tảBối cảnh toàn cầuTrong bối cảnh thực thi toàn cầu (ngoài bất kỳ chức năng nào), 2 đề cập đến đối tượng toàn cầu cho dù ở chế độ nghiêm ngặt hay không.
Lưu ý: Bạn luôn có thể dễ dàng nhận được đối tượng toàn cầu bằng cách sử dụng thuộc tính toàn cầu ____29, bất kể bối cảnh hiện tại mà mã của bạn đang chạy. You can always easily get the global object using the global 9 property, regardless of the current context in which your code is running. Chức năng bối cảnhBên trong một hàm, giá trị của 2 phụ thuộc vào cách gọi hàm.Vì mã sau không ở chế độ nghiêm ngặt và vì giá trị của 2 không được đặt bởi cuộc gọi, 2 sẽ mặc định cho đối tượng toàn cầu, đó là 3 trong trình duyệt.
Tuy nhiên, trong chế độ nghiêm ngặt, nếu giá trị của 2 không được đặt khi nhập bối cảnh thực thi, thì nó vẫn là 5, như được hiển thị trong ví dụ sau:
Lưu ý: Trong ví dụ thứ hai, 2 should be 5, because 8 was called directly and not as a method or property of an object (e.g. 9). This feature wasn't
implemented in some browsers when they first started to support strict mode. As a result, they incorrectly returned the 3 object. Để đặt giá trị của 2 thành một giá trị cụ thể khi gọi hàm, sử dụng 2 hoặc 3 như trong các ví dụ dưới đây.Bối cảnh lớpHành vi của 2 trong các lớp và chức năng là tương tự nhau, vì các lớp là các chức năng dưới mui xe. Nhưng có một số khác biệt và cảnh báo.Trong một hàm tạo lớp, 2 là một đối tượng thông thường. Tất cả các phương pháp không tĩnh trong lớp được thêm vào nguyên mẫu của 2:
Lưu ý: Phương pháp tĩnh không phải là thuộc tính của 2. They are properties of the class
itself. Các lớp học có nguồn gốcKhông giống như các hàm tạo lớp cơ sở, các hàm tạo dẫn xuất không có liên kết 2 ban đầu. Gọi 9 tạo ra liên kết 2 trong hàm tạo và về cơ bản có tác dụng đánh giá dòng mã sau, trong đó cơ sở là lớp kế thừa: Cảnh báo: Tham khảo 2 before calling 9 will throw an error. Các lớp dẫn xuất không được quay lại trước khi gọi 9, trừ khi họ trả lại 4 hoặc không có hàm tạo nào.
Ví dụĐiều này trong bối cảnh chức năng
Điều này và chuyển đổi đối tượng
Lưu ý rằng trong chế độ không đóng cửa, với 5 và 6, nếu giá trị được truyền dưới dạng 2 không phải là một đối tượng, một nỗ lực sẽ được thực hiện để chuyển đổi nó thành một đối tượng. Giá trị 8 và 5 trở thành đối tượng toàn cầu. Các nguyên thủy như 0 hoặc 1 sẽ được chuyển đổi thành một đối tượng bằng cách sử dụng hàm tạo liên quan, do đó số nguyên thủy 0 được chuyển đổi thành một đối tượng như thể bằng 3 và chuỗi 1 thành một đối tượng như thể bằng 5, ví dụ:
Phương thức BIND ()Ecmascript 5 đã giới thiệu 6. Gọi 7 tạo ra một chức năng mới với cùng một cơ thể và phạm vi như 8, nhưng trong đó 2 xảy ra trong hàm gốc, trong hàm mới, nó liên kết vĩnh viễn với đối số đầu tiên của 0, bất kể chức năng được sử dụng như thế nào.
Hàm mũi tênTrong các hàm mũi tên, 2 giữ lại giá trị của bối cảnh từ vựng kèm theo 2. Trong mã toàn cầu, nó sẽ được đặt thành đối tượng toàn cầu:
Lưu ý: Nếu 2 arg is passed to 5, 0, or 6 on invocation of an arrow function it will be ignored. You can still
prepend arguments to the call, but the first argument ( 7) should be set to 8. 0Không có vấn đề gì, ____ 79 2 được đặt thành gì khi nó được tạo ra (trong ví dụ trên, đối tượng toàn cầu). Điều tương tự áp dụng cho các hàm mũi tên được tạo ra bên trong các chức năng khác: 2 của chúng vẫn là của bối cảnh từ vựng kèm theo. 1Ở trên, hàm (gọi nó là hàm ẩn danh a) được gán cho 2 trả về một hàm khác (gọi nó là hàm ẩn danh b) được tạo dưới dạng hàm mũi tên. Do đó, 2 của hàm B được đặt vĩnh viễn thành 2 của 2 (hàm A) khi được gọi. Khi hàm được trả về (hàm B) được gọi, 2 của nó sẽ luôn là những gì nó được đặt thành ban đầu. Trong ví dụ mã trên, 2 của hàm B được đặt thành hoạt động của A ____22 là 9, do đó, nó vẫn được đặt thành 9 ngay cả khi được gọi theo cách thường đặt 2 thành 5 hoặc đối tượng toàn cầu (hoặc bất kỳ phương thức nào khác như trong Ví dụ trước trong bối cảnh thực hiện toàn cầu).Như một phương thức đối tượngKhi một hàm được gọi là phương thức của một đối tượng, 2 của nó được đặt thành đối tượng, phương thức được gọi là bật.Trong ví dụ sau, khi 4 được gọi, bên trong hàm 2 được liên kết với đối tượng 6. 2Lưu ý rằng hành vi này hoàn toàn không bị ảnh hưởng bởi cách xác định hoặc ở đâu chức năng. Trong ví dụ trước, chúng tôi đã xác định chức năng nội tuyến là thành viên 8 trong định nghĩa của 6. Tuy nhiên, chúng ta có thể dễ dàng xác định chức năng trước và sau đó gắn nó vào 9. Làm như vậy dẫn đến cùng một hành vi: 3Điều này chứng tỏ rằng chỉ có vấn đề là chức năng được gọi từ thành viên 8 của 6.Tương tự, ràng buộc 2 chỉ bị ảnh hưởng bởi tham chiếu thành viên ngay lập tức nhất. Trong ví dụ sau, khi chúng tôi gọi hàm, chúng tôi gọi nó là phương thức 03 của đối tượng 04. Lần này trong quá trình thực thi, 2 bên trong hàm sẽ đề cập đến 04. Thực tế là đối tượng tự nó là thành viên của 6 không có hậu quả; Tài liệu tham khảo ngay lập tức nhất là tất cả những gì quan trọng. 4Điều này trên chuỗi nguyên mẫu của đối tượngKhái niệm tương tự cũng đúng với các phương thức được xác định ở đâu đó trên chuỗi nguyên mẫu của đối tượng. Nếu phương thức nằm trên chuỗi nguyên mẫu của một đối tượng, 2 đề cập đến đối tượng, phương thức đã được gọi, như thể phương thức nằm trên đối tượng. 5Trong ví dụ này, đối tượng được gán cho biến 09 không có thuộc tính 8 riêng của nó, nó kế thừa nó từ nguyên mẫu của nó. Nhưng không có vấn đề gì khi tìm kiếm 8 cuối cùng tìm thấy một thành viên có tên đó trên 6; Việc tra cứu bắt đầu như một tham chiếu đến 13, do đó 2 bên trong hàm lấy giá trị của đối tượng được gọi là 09. Đó là, vì 8 được gọi là phương pháp của 09, 2 của nó đề cập đến 09. Đây là một tính năng thú vị của kế thừa nguyên mẫu của JavaScript.cái này với một getter hoặc setterMột lần nữa, khái niệm tương tự cũng đúng khi một hàm được gọi từ một getter hoặc một setter. Một hàm được sử dụng như getter hoặc setter có 2 liên kết với đối tượng mà từ đó thuộc tính đang được đặt hoặc nhận. 6Là một nhà xây dựngKhi một hàm được sử dụng làm hàm tạo (với từ khóa 21), 2 của nó bị ràng buộc với đối tượng mới được xây dựng. Lưu ý: Mặc dù mặc định cho hàm tạo là trả về đối tượng được tham chiếu bởi 2, it can instead return some other object (if the return value isn't an object, then the 2 object is returned). 7Trong ví dụ cuối cùng ( 25), bởi vì một đối tượng đã được trả lại trong quá trình xây dựng, đối tượng mới mà 2 bị ràng buộc sẽ bị loại bỏ. .
Là một người xử lý sự kiện DOMKhi một hàm được sử dụng làm trình xử lý sự kiện, 2 của nó được đặt thành phần tử mà người nghe được đặt (một số trình duyệt không tuân theo quy ước này cho người nghe được thêm động với các phương thức khác với 29). 8Trong một người xử lý sự kiện nội tuyếnKhi mã được gọi từ một trình xử lý trực tuyến nội tuyến, 2 của nó sẽ được đặt thành phần tử DOM mà người nghe được đặt: 9Cảnh báo trên cho thấy 31. Tuy nhiên, lưu ý rằng chỉ có mã bên ngoài có 2 đặt theo cách này: 0Trong trường hợp này, 2 của hàm bên trong không được đặt, vì vậy nó trả về đối tượng toàn cầu/cửa sổ (nghĩa là đối tượng mặc định trong chế độ không hạn chế trong đó 2 không được đặt bởi cuộc gọi).Điều này trong các lớp họcGiống như với các chức năng thông thường, giá trị của 2 trong các phương thức phụ thuộc vào cách chúng được gọi. Đôi khi rất hữu ích khi ghi đè hành vi này để 2 trong các lớp luôn đề cập đến thể hiện lớp. Để đạt được điều này, hãy liên kết các phương thức lớp trong hàm tạo: 1 Lưu ý: Các lớp luôn là mã chế độ nghiêm ngặt.Các phương thức gọi với 2 will throw an error. Thông số kỹ thuật
Tính tương thích của trình duyệt webBảng BCD chỉ tải trong trình duyệt Xem thêm |