Từ khóa này có cần thiết trong javascript không?
Bối cảnh là một trong những chủ đề luôn tạo ra nhiều nhầm lẫn khi ai đó bắt đầu học javascript và đó là chủ đề mà người phỏng vấn hỏi rất nhiều. Show
bối cảnh là gì?Bối cảnh luôn là giá trị của từ khóa foo.apply( context,[param1, param2, param3]); 1 tham chiếu đến đối tượng “sở hữu” mã hiện đang thực thi hoặc chức năng mà nó được xem xétChúng tôi biết rằng foo.apply( context,[param1, param2, param3]); 2 là một đối tượng toàn cầu trong trình duyệt, vì vậy nếu chúng tôi nhập foo.apply( context,[param1, param2, param3]); 1 vào bảng điều khiển và nó sẽ trả về đối tượng cửa sổ, điều này sẽ xảy ratrong nút. js CLI nếu bạn thử làm như trên, bạn sẽ nhận được một đối tượng có tất cả các chức năng được sử dụng trên toàn cầu như foo.apply( context,[param1, param2, param3]); 4, foo.apply( context,[param1, param2, param3]); 0, v.v. (Thử một lần)
Bối cảnh - trên toàn cầu và bên trong một chức năngcái này ở cấp độ toàn cầu được gọi trên đối tượng toàn cầufoo.apply( context,[param1, param2, param3]); 3 là chức năng được xác định ở cấp độ toàn cầu và được gọi trên đối tượng cấp độ toàn cầu i. e foo.apply( context,[param1, param2, param3]); 2vì vậy gọi foo.apply( context,[param1, param2, param3]); 3và foo.apply( context,[param1, param2, param3]); 6là như nhau. Do đó bối cảnh là một đối tượng foo.apply( context,[param1, param2, param3]); 2chức năng bên trong này được gọi trên đối tượng chức năng ở cấp độ toàn cầuTrong khi đó, nếu chúng tôi thực hiện foo.apply( context,[param1, param2, param3]); 8 ở cấp độ toàn cầu thì sẽ nhận được foo.apply( context,[param1, param2, param3]); 1 là đối tượng foo.apply( context,[param1, param2, param3]); 3
Bối cảnh - dưới chức năng cấp 2Bối cảnh — khi chức năng được xác định trên toàn cầu và được sử dụng dưới một đối tượng (Ràng buộc ngầm định)
Ngữ cảnh hoạt động như thế nào trong 'sử dụng nghiêm ngặt'?Khi sử dụng // use of bind3 trong một chức năng, bối cảnh tôi. e từ khóa này hoạt động khác. Bối cảnh vẫn là bất cứ điều gì nó được gọi
Ngữ cảnh hoạt động như thế nào trong chức năng mũi tên?Các chức năng mũi tên hoạt động khác với các chức năng thông thường về ngữ cảnh. foo.apply( context,[param1, param2, param3]); 1sẽ luôn đề cập đến phạm vi từ vựng (đọc ở đây về phạm vi), tôi. e foo.apply( context,[param1, param2, param3]); 1 giữ nguyên giá trị của ngữ cảnh từ vựng kèm theoTrong mã toàn cầu, nó sẽ được đặt thành đối tượng toàn cầu, do đó chúng tôi nhận được trên true Bối cảnh hoạt động như thế nào trên chuỗi nguyên mẫu của đối tượng?Bối cảnh tuân theo cùng một quy tắc, tôi. e. nếu hàm nằm trên chuỗi nguyên mẫu của một đối tượng, thì foo.apply( context,[param1, param2, param3]); 1 đề cập đến đối tượng mà phương thức được gọi trên đóNếu chúng tôi gọi // use of bind9 sẽ nhận được foo.apply( context,[param1, param2, param3]); 20 và nếu foo.apply( context,[param1, param2, param3]); 21 được gọi trên foo.apply( context,[param1, param2, param3]); 22 được tạo từ foo.apply( context,[param1, param2, param3]); 23 đã xác định foo.apply( context,[param1, param2, param3]); 24 thì nó sẽ trả về giá trị do đó 10Bối cảnh hoạt động như thế nào trong trình xử lý sự kiện?Bối cảnh trong trường hợp trình xử lý sự kiện đề cập đến phần tử đã nhận sự kiện Ở đây chúng ta đã thêm một sự kiện click jquery vào thẻ body của DOM, và chúng ta có thể thấy rằng ngữ cảnh trả về phần tử body Bối cảnh hoạt động như thế nào trong bối cảnh thực thi?Nếu bạn không biết bối cảnh thực thi là gì (đọc tại đây). Nói tóm lại, bối cảnh thực thi là 'môi trường' hoặc phạm vi trong đó một chức năng thực thi trong. Mỗi khi một hàm được gọi, một foo.apply( context,[param1, param2, param3]); 25 mới được tạo. Mỗi cuộc gọi đến một foo.apply( context,[param1, param2, param3]); 25 có 2 giai đoạn
Giá trị của foo.apply( context,[param1, param2, param3]); 1 được xác định ở giai đoạn tạo, không phải ở thời điểm thực thi. Tuy nhiên, quy tắc xác định foo.apply( context,[param1, param2, param3]); 1 vẫn giữ nguyênBối cảnh khác với phạm vi như thế nào?Phạm vi và ngữ cảnh hoàn toàn là một khái niệm khác nhưng thường được nhà phát triển sắp tới sử dụng thay thế cho nhau Phạm vi là khả năng truy cập của các biến, hàm hoặc đối tượng trong một số phần cụ thể của mã của bạn trong thời gian chạy. Đọc thêm ở đây về phạm vi Mọi lời gọi hàm đều có cả phạm vi và ngữ cảnh được liên kết với nó Làm thế nào để thay đổi bối cảnh một cách rõ ràng?Chúng ta có thể tự động thay đổi ngữ cảnh của bất kỳ phương pháp nào bằng cách sử dụng phương pháp foo.apply( context,[param1, param2, param3]); 29 ,foo.apply( context,[param1, param2, param3]); 00và foo.apply( context,[param1, param2, param3]); 01Cuộc gọi - Đối số đầu tiên mà foo.apply( context,[param1, param2, param3]); 02 đưa vào là ngữ cảnh bạn muốn sử dụng. Sau đó, bạn có thể chuyển vào bất kỳ số lượng giá trị được phân tách bằng dấu phẩy nàofoo.apply( context,[param1, param2, param3]); 3Áp dụng — Điều này giống như foo.apply( context,[param1, param2, param3]); 02 nhưng khác ở chỗ không. tranh luận. Áp dụng chỉ hỗ trợ 2 đối số, ngữ cảnh và mảng giá trịfoo.apply( context,[param1, param2, param3]); Ràng buộc — Nó trả về một hàm mới được liên kết vĩnh viễn với đối số đầu tiên của foo.apply( context,[param1, param2, param3]); 04 bất kể hàm đó đang được sử dụng như thế nào. foo.apply( context,[param1, param2, param3]); 04 không gọi hàm liên kết ngay lập tức, thay vào đó nó trả về một hàm mới mà chúng ta có thể chạy sauTại sao chúng ta cần thay đổi bối cảnh một cách rõ ràng?
2. Currying và ứng dụng một phần là một phần khác trong đó thay đổi rõ ràng trong ngữ cảnh được sử dụng 3. Để thực hiện các chức năng tiện ích như 4. Kế thừa là một nơi khác có thể sử dụng thay đổi ngữ cảnh rõ ràng
Các trường hợp chúng ta cần quan tâm đến bối cảnh là gì?Chúng tôi có thể mất bối cảnh tôi. e nhận được giá trị foo.apply( context,[param1, param2, param3]); 20 cho foo.apply( context,[param1, param2, param3]); 1in1. Hàm lồng nhauChúng ta cần giữ ngữ cảnh của đối tượng foo.apply( context,[param1, param2, param3]); 23 được tham chiếu khi hàm gọi lại được gọi, ở trên, điều đó không xảy ra và chúng ta gặp lỗiChúng ta có thể loại bỏ lỗi trên bằng cách thay thế mã foo.apply( context,[param1, param2, param3]); 21 bằng bên dưới// use of bind 2. Phương thức gọi lạifoo.apply( context,[param1, param2, param3]); 2Ở trên sẽ trả về foo.apply( context,[param1, param2, param3]); 22, hãy suy nghĩ một chút tại sao? foo.apply( context,[param1, param2, param3]); 0và, foo.apply( context,[param1, param2, param3]); 23 có chức năng foo.apply( context,[param1, param2, param3]); 24, tách biệt với đối tượng foo.apply( context,[param1, param2, param3]); 23Giải pháp là foo.apply( context,[param1, param2, param3]); 2
Vui lòng cân nhắc nhập email của bạn tại đây nếu bạn muốn được thêm vào danh sách email của tôi và theo dõi tôi trên phương tiện để đọc thêm bài viết về javascript và trên github để xem mã điên rồ của tôi. Nếu có gì chưa rõ hoặc muốn chỉ ra điều gì, hãy comment xuống bên dưới Từ khóa này có quan trọng trong JavaScript không?Trong JavaScript, từ khóa this đề cập đến một đối tượng . Đối tượng nào phụ thuộc vào cách đối tượng này được gọi (được sử dụng hoặc được gọi). Từ khóa này đề cập đến các đối tượng khác nhau tùy thuộc vào cách nó được sử dụng. Trong một phương thức đối tượng, điều này đề cập đến đối tượng.
Bạn có nên tránh sử dụng điều này trong JavaScript?Cách tốt nhất để tránh các sự cố liên quan này là hoàn toàn không sử dụng tính năng này . JavaScript không có điều này có thể là một ngôn ngữ lập trình chức năng tốt hơn. Chúng ta có thể xây dựng các đối tượng được đóng gói mà không cần sử dụng this , như một tập hợp các bao đóng.
Tại sao từ khóa này không được sử dụng trong JavaScript?Để giải thích tôi sẽ nói. Từ khóa this bị cấm hoặc hạn chế vì các hàm (ở chế độ không nghiêm ngặt) có thể truy cập đối tượng chung thông qua this . Ngăn chặn quyền truy cập vào đối tượng toàn cầu là một trong những mục đích chính của bất kỳ hệ thống hộp cát nào.
Làm cách nào để tránh từ khóa này trong JavaScript?Có thể tránh sử dụng điều này trong hàm tạo bằng cách sử dụng Đối tượng. create để tạo chuỗi nguyên mẫu, sau đó khai báo các thuộc tính của bạn trực tiếp trên đối tượng kết quả . Điều này loại bỏ nhu cầu this trong hàm Shape của bạn, nghĩa là chúng ta không còn cần gọi nó bằng new nữa. |