Hướng dẫn how to check javascript flow of execution - cách kiểm tra luồng thực thi javascript
Có một trang web trên đó một khóa đặc biệt được tạo dựa trên dữ liệu trên trang nguồn. Tôi có thể bằng cách nào đó "từng bước" xem quy trình thực thi mã JavaScript trên trang web này để tìm khóa khóa này được tạo ở đâu không? Tôi có nghĩa là với khả năng theo dõi tất cả các biến cục bộ / toàn cầu được tạo và thay đổi trong quá trình thực thi mã. Show
P.S. Khóa này không được lưu trữ ở bất cứ đâu, nó được tạo trong mã JavaScript, với khóa này có kết nối nền với ổ cắm web và sau đó khóa này không được sử dụng ở bất kỳ nơi nào khác. Khi được hỏi ngày 25 tháng 5 năm 2020 lúc 18:49May 25, 2020 at 18:49
1 Tất cả mã JavaScript cần được lưu trữ và chạy trong một số loại môi trường. Trong hầu hết các trường hợp, môi trường đó sẽ là một trình duyệt web. Đối với bất kỳ đoạn mã JavaScript nào được thực thi trong trình duyệt web, rất nhiều quy trình diễn ra phía sau hậu trường. Trong bài viết này, chúng ta sẽ xem xét mọi thứ xảy ra đằng sau hậu trường để mã JavaScript chạy trong trình duyệt web. Trước khi chúng ta đi sâu, đây là một số điều kiện tiên quyết để làm quen với bản thân, bởi vì chúng ta sẽ sử dụng chúng thường xuyên trong bài viết này. Bây giờ, rằng chúng tôi đã tránh xa những thứ đó, chúng ta hãy lao vào. Vì những người không biết, trình duyệt không hiểu mã JavaScript cấp cao mà chúng tôi viết trong các ứng dụng của chúng tôi. Nó cần được chuyển đổi thành một định dạng mà trình duyệt và máy tính của chúng tôi có thể hiểu - mã máy. Trong khi đọc qua HTML, nếu trình duyệt gặp mã JavaScript để chạy qua thẻ Sau đó, công cụ JavaScript của trình duyệt tạo ra một môi trường đặc biệt để xử lý việc chuyển đổi và thực hiện mã JavaScript này. Môi trường này được gọi là 1. 1.Bối cảnh thực thi chứa mã hiện đang chạy và mọi thứ hỗ trợ thực thi. Trong thời gian chạy ngữ cảnh thực thi, mã cụ thể được phân tích cú pháp, các biến và hàm được lưu trữ trong bộ nhớ, mã byte có thể thực thi được tạo và mã được thực thi. Có hai loại bối cảnh thực thi trong JavaScript:
Hãy xem xét chi tiết cả hai. Bối cảnh thực thi toàn cầu (GEC)Bối cảnh thực thi chức năng (FEC) Hãy xem xét chi tiết cả hai.not inside of a function gets executed. Bất cứ khi nào công cụ JavaScript nhận được một tệp tập lệnh, trước tiên nó sẽ tạo ra một bối cảnh thực thi mặc định được gọi là2. Bối cảnh thực thi chức năng (FEC)Hãy xem xét chi tiết cả hai. Bất cứ khi nào công cụ JavaScript nhận được một tệp tập lệnh, trước tiên nó sẽ tạo ra một bối cảnh thực thi mặc định được gọi là 2.GEC là bối cảnh thực thi cơ sở/mặc định trong đó tất cả mã JavaScript không nằm trong hàm được thực thi.Đối với mỗi tệp JavaScript, chỉ có thể có một GEC. Bất cứ khi nào một hàm được gọi, công cụ JavaScript sẽ tạo ra một loại bối cảnh thực thi khác được gọi là bối cảnh thực thi chức năng (FEC) trong GEC để đánh giá và thực thi mã trong hàm đó.
Vì mọi cuộc gọi chức năng đều có FEC của riêng mình, nên có thể có nhiều hơn một FEC trong thời gian chạy của một tập lệnh.Bối cảnh thực thi được tạo ra như thế nào? Bây giờ chúng ta nhận thức được bối cảnh thực thi là gì và các loại khác nhau có sẵn, chúng ta hãy xem xét cách tạo ra.
Trong giai đoạn sáng tạo, bối cảnh thực thi đầu tiên được liên kết với đối tượng bối cảnh thực thi (ECO). Đối tượng bối cảnh thực thi lưu trữ rất nhiều dữ liệu quan trọng mà mã trong bối cảnh thực thi sử dụng trong thời gian chạy của nó. Giai đoạn tạo xảy ra trong 3 giai đoạn, trong đó các thuộc tính của đối tượng bối cảnh thực thi được xác định và đặt. Các giai đoạn này là:Tạo đối tượng biến (VO) Tạo chuỗi phạm vi Đặt giá trị của từ khóa 3Hãy để chúng tôi đi qua từng giai đoạn chi tiết. Giai đoạn tạo: Tạo đối tượng biến (VO)Hoisting. Since this is an important concept, we'll talk about it briefly before moving on to the next stage. Đối tượng biến (VO) là một thùng chứa giống như đối tượng được tạo trong bối cảnh thực thi. Nó lưu trữ các biến và khai báo chức năng được xác định trong bối cảnh thực thi đó.Trong GEC, đối với mỗi biến được khai báo với từ khóa 4, một thuộc tính được thêm vào VO chỉ vào biến đó và được đặt thành 'không xác định'.Chức năng nâng caoTrong hầu hết các kịch bản khi xây dựng một ứng dụng, các nhà phát triển có thể chọn xác định các chức năng ở đầu tập lệnh và chỉ sau đó gọi chúng xuống mã, như vậy: Tuy nhiên, do nâng cao, điều ngược lại vẫn sẽ hoạt động. Trường hợp chúng ta có thể gọi các chức năng đầu tiên sau đó xác định chúng sau đó xuống tập lệnh. Trong mã trên, khai báo hàm 5 sẽ được lưu trữ trong bộ nhớ của VO, làm cho nó có sẵn để sử dụng ngay cả trước khi nó được xác định.Tăng cường biếnCác biến được khởi tạo với từ khóa 4 được lưu trữ trong bộ nhớ của Vo cảnh thực hiện hiện tại là một thuộc tính và được khởi tạo với giá trị 7. Điều này có nghĩa là, không giống như các chức năng, cố gắng truy cập giá trị của biến trước khi nó được xác định sẽ dẫn đến 7.Quy tắc nâng cơ sở nângTăng chỉ hoạt động cho các khai báo chức năng, không biểu thức. Dưới đây là một ví dụ về biểu thức chức năng trong đó thực thi mã sẽ bị phá vỡ.
Việc thực thi mã bị phá vỡ, bởi vì với các biểu thức chức năng, 5 sẽ được nâng như một biến không phải là một hàm. Và với việc nâng biến biến, giá trị của nó sẽ được đặt thành 7. Đó là lý do tại sao chúng tôi gặp lỗi:Ngoài ra, việc nâng biến không hoạt động cho các biến được khởi tạo với từ khóa 1 hoặc 2. Cố gắng truy cập một biến trước khai báo và sử dụng các từ khóa 1 và 2 để khai báo sau này sẽ dẫn đến 5.Trong trường hợp này, chúng sẽ được nâng lên nhưng không được gán với giá trị mặc định là 7. 7 sẽ ném lỗi:Giai đoạn sáng tạo: Tạo chuỗi phạm viSau khi tạo ra đối tượng biến (VO), việc tạo ra chuỗi phạm vi là giai đoạn tiếp theo trong giai đoạn sáng tạo của bối cảnh thực hiện. Phạm vi trong JavaScript là một cơ chế xác định mức độ có thể truy cập của một đoạn mã với các phần khác của cơ sở mã. Phạm vi trả lời các câu hỏi: Từ đâu có thể truy cập một đoạn mã? Nó không thể truy cập từ đâu? Điều gì có thể truy cập nó, và những gì không thể? Mỗi bối cảnh thực thi chức năng tạo phạm vi của nó: không gian/môi trường nơi các biến và hàm mà nó xác định có thể được truy cập thông qua một quy trình gọi là phạm vi. Điều này có nghĩa là vị trí của một cái gì đó trong một cơ sở mã, nghĩa là, nơi có một đoạn mã. Khi một hàm được xác định trong một hàm khác, hàm bên trong có quyền truy cập vào mã được xác định theo hàm bên ngoài và của cha mẹ. Hành vi này được gọi là phạm vi từ vựng.lexical scoping. Tuy nhiên, hàm bên ngoài không có quyền truy cập vào mã trong hàm bên trong. Khái niệm về phạm vi này mang đến một hiện tượng liên kết trong JavaScript gọi là đóng cửa. Đây là khi các hàm bên trong luôn có quyền truy cập vào mã được liên kết với các hàm bên ngoài, ngay cả sau khi thực hiện các hàm bên ngoài hoàn tất. Bạn có thể tìm hiểu thêm đóng cửa ở đây. Hãy xem xét một số ví dụ để hiểu rõ hơn:
Bây giờ các biến 4 và 5 không được xác định trong hàm 1, chỉ 6. Tuy nhiên, do phạm vi từ vựng, nó có quyền truy cập vào phạm vi của hàm mà nó nằm trong và của cha mẹ của nó.Khi chạy mã, động cơ JS sẽ không tìm thấy biến 5 trong phạm vi của hàm 1. Vì vậy, nó nhìn lên phạm vi của cha mẹ, bắt đầu với chức năng ____29. Ở đó, nó tìm thấy biến 4. Nó quay trở lại hàm 1 và giải quyết biến 5 ở đó với nó.Quá trình tương tự cho biến 4. Động cơ JS nhìn lên qua phạm vi của tất cả cha mẹ của nó cho đến phạm vi của GEC, giải quyết giá trị của nó trong hàm 1.Ý tưởng này về động cơ JavaScript vượt qua phạm vi của bối cảnh thực thi mà một hàm được định nghĩa để giải quyết các biến và hàm được gọi trong chúng được gọi là chuỗi phạm vi.scope chain. Chỉ khi công cụ JS không thể giải quyết một biến trong chuỗi phạm vi, nó mới ngừng thực thi và ném lỗi. Tuy nhiên, điều này không hoạt động lạc hậu. Đó là, phạm vi toàn cầu sẽ không bao giờ có quyền truy cập vào các biến của hàm bên trong trừ khi chúng là 9 từ hàm.Chuỗi phạm vi hoạt động như một kính một chiều. Bạn có thể nhìn thấy bên ngoài, nhưng mọi người từ bên ngoài không thể nhìn thấy bạn. Và đó là lý do tại sao mũi tên màu đỏ trong hình trên là hướng lên trên bởi vì đó là hướng duy nhất mà chuỗi phạm vi đi. Giai đoạn tạo: Đặt giá trị của từ khóa "này"Giai đoạn tiếp theo và cuối cùng sau khi phạm vi trong giai đoạn tạo của bối cảnh thực thi đang đặt giá trị của từ khóa 3.Từ khóa JavaScript 3 đề cập đến phạm vi nơi bối cảnh thực thi thuộc về.Khi chuỗi phạm vi được tạo, giá trị của 2 được khởi tạo bởi động cơ JS.
var msg = "I will rule the world!";
const Victor = {
msg: "Victor will rule the world!",
printMsg() { console.log(this.msg) },
};
Victor.printMsg(); // logs "Victor will rule the world!" to the console. |
Bối cảnh thực thi toàn cầu | Chức năng thực thi bối cảnh |
---|---|
Tạo một đối tượng biến toàn cầu lưu trữ các khai báo chức năng và biến. | Không tạo ra một đối tượng biến toàn cầu. Thay vào đó, nó tạo ra một đối tượng đối số lưu trữ tất cả các đối số được truyền cho hàm. |
Tạo đối tượng `` này lưu trữ tất cả các biến và hàm trong phạm vi toàn cầu là phương thức và thuộc tính. | Không tạo đối tượng `này, nhưng có quyền truy cập vào môi trường mà nó được xác định. Thông thường đối tượng `window`. |
Không thể truy cập mã của bối cảnh hàm được xác định trong đó | Do phạm vi, có quyền truy cập vào mã (các biến và hàm) trong bối cảnh nó được xác định và của cha mẹ của nó |
Đặt không gian bộ nhớ cho các biến và hàm được xác định trên toàn cầu | Đặt không gian bộ nhớ chỉ cho các biến và hàm được xác định trong hàm. |
Sự kết luận
Bối cảnh thực thi của JavaScript là cơ sở để hiểu chính xác nhiều khái niệm cơ bản khác.
Bối cảnh thực thi (GEC và FEC) và ngăn xếp cuộc gọi là các quy trình được thực hiện dưới mui xe bởi công cụ JS cho phép mã của chúng tôi chạy.
Hy vọng bây giờ bạn có một sự hiểu biết tốt hơn trong đó đặt hàng các chức năng/mã của bạn chạy và cách động cơ JavaScript đối xử với chúng.
Là một nhà phát triển, có một sự hiểu biết tốt về các khái niệm này giúp bạn:
- Nhận được một sự hiểu biết tốt về các ngôn ngữ trong và ngoài của ngôn ngữ.
- Nhận được một nắm bắt tốt về một ngôn ngữ các khái niệm cơ bản/cốt lõi.
- Viết mã sạch, có thể bảo trì và có cấu trúc tốt, đưa ít lỗi hơn vào sản xuất.
Tất cả điều này sẽ làm cho bạn một nhà phát triển tốt hơn nói chung.
Hy vọng bạn tìm thấy bài viết này hữu ích. Hãy chia sẻ nó với bạn bè và mạng của bạn, và vui lòng kết nối với tôi trên Twitter và blog của tôi, nơi tôi chia sẻ một loạt các bài viết và tài nguyên giáo dục miễn phí. Điều này thực sự thúc đẩy tôi xuất bản nhiều hơn.
Cảm ơn bạn đã đọc, và mã hóa hạnh phúc!
Học mã miễn phí. Chương trình giảng dạy nguồn mở của Freecodecamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu