Làm thế nào để bạn đánh giá một mã javascript?
Đây là chương thứ ba của loạt bài Viết một khung JavaScript. Trong chương này, tôi sẽ giải thích các cách đánh giá mã khác nhau trong trình duyệt và các vấn đề mà chúng gây ra. Tôi cũng sẽ giới thiệu một phương pháp dựa trên một số tính năng JavaScript mới hoặc ít được biết đến hơn. Show
Loạt bài này nói về một framework phía máy khách mã nguồn mở, được gọi là NX. Trong loạt bài này, tôi giải thích những khó khăn chính mà tôi phải vượt qua khi viết framework. Nếu bạn quan tâm đến NX, vui lòng truy cập trang chủ Bộ truyện bao gồm các chương sau
Ác ma
Một giải pháp phổ biến để đánh giá mã là hàm 8 . Mã được đánh giá bởi 8 có quyền truy cập vào các lần đóng và phạm vi toàn cầu, điều này dẫn đến một vấn đề bảo mật được gọi là chèn mã và khiến 8 trở thành một trong những tính năng khét tiếng nhất của JavaScriptMặc dù bị cau mày, nhưng 8 rất hữu ích trong một số tình huống. Hầu hết các khung giao diện người dùng hiện đại đều yêu cầu chức năng của nó nhưng không dám sử dụng vì vấn đề được đề cập ở trên. Do đó, nhiều giải pháp thay thế đã xuất hiện để đánh giá các chuỗi trong hộp cát thay vì phạm vi toàn cầu. Hộp cát ngăn mã truy cập dữ liệu an toàn. Thông thường, nó là một đối tượng JavaScript đơn giản, thay thế đối tượng toàn cầu cho mã được đánh giácách chungPhương án thay thế 8 phổ biến nhất là triển khai lại hoàn toàn – quy trình gồm hai bước, bao gồm phân tích cú pháp và diễn giải chuỗi đã truyền. Đầu tiên, trình phân tích cú pháp tạo cây cú pháp trừu tượng, sau đó trình thông dịch sẽ duyệt cây và diễn giải nó dưới dạng mã bên trong hộp cátĐây là một giải pháp được sử dụng rộng rãi, nhưng nó được cho là quá nặng đối với một thứ đơn giản như vậy. Viết lại mọi thứ từ đầu thay vì vá lỗi 8 tạo ra rất nhiều lỗi và cũng cần phải sửa đổi thường xuyên để theo kịp các bản cập nhật ngôn ngữ mới nhấtmột cách khácNX cố gắng tránh triển khai lại mã gốc. Đánh giá được xử lý bởi một thư viện nhỏ sử dụng một số tính năng JavaScript mới hoặc ít được biết đến hơn Phần này sẽ dần dần giới thiệu các tính năng này và sử dụng chúng để giải thích thư viện đánh giá mã nx-compile. Thư viện có một hàm tên là 3, hoạt động như bên dưới
Đến cuối bài viết này, chúng ta sẽ triển khai hàm 3 trong chưa đầy 20 dòngChức năng mới()
Hàm tạo 5 là một thay thế cho 8. 7 đánh giá chuỗi 8 đã truyền dưới dạng mã và trả về một hàm mới thực thi mã đó. Nó khác với 8 ở hai điểm chính
0 là lựa chọn thay thế tốt hơn cho 8 đối với trường hợp sử dụng của chúng ta. Nó có hiệu suất và bảo mật vượt trội, nhưng quyền truy cập phạm vi toàn cầu vẫn phải được ngăn chặn để làm cho nó khả thiTừ khóa 'với'
2 là một từ khóa ít được biết đến hơn trong JavaScript. Nó cho phép thực thi bán hộp cát. Mã bên trong một khối 2 cố gắng truy xuất các biến từ đối tượng hộp cát đã truyền trước, nhưng nếu không tìm thấy ở đó, mã sẽ tìm biến trong phạm vi đóng và phạm vi toàn cầu. Quyền truy cập vào phạm vi đóng bị ngăn chặn bởi 0 vì vậy chúng tôi chỉ phải lo lắng về phạm vi toàn cầu
2 sử dụng _______76 toán tử trong nội bộ. Đối với mọi quyền truy cập biến bên trong khối, nó sẽ đánh giá điều kiện 7. Nếu điều kiện là đúng, nó sẽ lấy biến từ sandbox. Nếu không, nó sẽ tìm biến trong phạm vi toàn cầu. Bằng cách đánh lừa 2 để luôn đánh giá 7 là trung thực, chúng tôi có thể ngăn nó truy cập vào phạm vi toàn cầuproxy ES6
ES6 70 bao bọc một đối tượng và xác định các hàm bẫy, có thể chặn các hoạt động cơ bản trên đối tượng đó. Các chức năng bẫy được gọi khi một hoạt động xảy ra. Bằng cách bọc đối tượng sandbox trong một 70 và xác định một 72 bẫy, chúng ta có thể ghi đè hành vi mặc định của toán tử 6 7Đoạn mã trên đánh lừa khối 2 . 7 sẽ luôn trả về giá trị true vì 72 bẫy luôn trả về giá trị true. Mã bên trong khối 2 sẽ không bao giờ thử truy cập vào đối tượng chungBiểu tượng. không thể dò được
78 là một ký hiệu nổi tiếng. Biểu tượng nổi tiếng là JavaScript tích hợp sẵn 79, biểu thị hành vi ngôn ngữ bên trong. Ví dụ, các ký hiệu nổi tiếng có thể được sử dụng để thêm hoặc ghi đè lên hành vi lặp lại hoặc chuyển đổi nguyên thủy
78 xác định các thuộc tính không thể đọc được của một đối tượng. Các thuộc tính không thể truy xuất không bao giờ được truy xuất từ đối tượng hộp cát trong câu lệnh 2, thay vào đó, chúng được truy xuất ngay từ phạm vi đóng hoặc phạm vi toàn cục. 78 là một tính năng rất hiếm khi được sử dụng. Bạn có thể đọc về lý do nó được giới thiệu trên trang nàyChúng tôi có thể khắc phục vấn đề trên bằng cách xác định một 13 bẫy trên hộp cát 70, bẫy này chặn truy xuất 78 và luôn trả về không xác định. Điều này sẽ đánh lừa khối 2 nghĩ rằng đối tượng hộp cát của chúng ta không có thuộc tính không thể khám phá 1WeakMap cho bộ nhớ đệmMã này hiện đã được bảo mật, nhưng hiệu suất của nó vẫn có thể được nâng cấp vì nó tạo ra một 70 mới trên mỗi lần gọi hàm được trả về. Điều này có thể được ngăn chặn bằng cách lưu vào bộ đệm và sử dụng cùng một 70 cho mọi lệnh gọi hàm với cùng một đối tượng hộp cátProxy thuộc về một đối tượng hộp cát, vì vậy chúng ta chỉ cần thêm proxy vào đối tượng hộp cát làm thuộc tính. Tuy nhiên, điều này sẽ tiết lộ chi tiết triển khai của chúng tôi cho công chúng và nó sẽ không hoạt động trong trường hợp một đối tượng hộp cát không thể thay đổi bị đóng băng với 19. Sử dụng 90 là một giải pháp thay thế tốt hơn trong trường hợp này
Có thể sử dụng 90 để đính kèm dữ liệu vào một đối tượng mà không cần mở rộng trực tiếp đối tượng đó bằng các thuộc tính. Chúng ta có thể sử dụng 92 để gián tiếp thêm 93 được lưu trong bộ nhớ đệm vào các đối tượng hộp cát 9Bằng cách này, chỉ một _______170 sẽ được tạo cho mỗi đối tượng hộp cát ghi chú cuối cùngVí dụ 3 ở trên là một trình đánh giá mã hộp cát đang hoạt động chỉ trong 19 dòng mã. Nếu muốn xem mã nguồn đầy đủ của thư viện nx-compile, bạn có thể tìm thấy nó trong kho lưu trữ Github nàyNgoài việc giải thích việc đánh giá mã, mục tiêu của chương này là chỉ ra cách sử dụng các tính năng mới của ES6 để thay đổi các tính năng hiện có, thay vì phát minh lại chúng. Tôi đã cố gắng chứng minh toàn bộ sức mạnh của 93 và 97 thông qua các ví dụPhần kết luậnNếu bạn quan tâm đến NX framework, vui lòng truy cập trang chủ. Những độc giả thích mạo hiểm có thể tìm thấy mã nguồn NX trong kho lưu trữ Github này Đánh giá JavaScript là gì?JavaScript eval()
. Nếu đối số là một biểu thức, eval() đánh giá biểu thức. Nếu đối số là một hoặc nhiều câu lệnh JavaScript, eval() sẽ thực thi các câu lệnh. evaluates or executes an argument. If the argument is an expression, eval() evaluates the expression. If the argument is one or more JavaScript statements, eval() executes the statements.
Làm cách nào để sử dụng JavaScript eval?eval() là một hàm toàn cục trong JavaScript để đánh giá một chuỗi đã chỉ định dưới dạng mã JavaScript và thực thi nó. . Ví dụ. đánh giá. eval("alert('điều này được thực hiện bởi eval()')");. Ví dụ. đánh giá. kết quả var; . Ví dụ. eval với đối tượng JSON JavaScript sử dụng mô hình đánh giá nào?JavaScript và nhiều ngôn ngữ khác như Java, Python hoặc Ruby chỉ sử dụng chiến lược đánh giá pass-by-value . Đây là lý do tại sao JavaScript có thể được gọi là ngôn ngữ truyền giá trị.
Hàm nào được sử dụng để đánh giá một biểu thức trong JavaScript?Hàm eval() dùng để đánh giá biểu thức. Nếu đối số đại diện cho một hoặc nhiều câu lệnh JavaScript, eval() sẽ đánh giá các câu lệnh. Chúng tôi không gọi eval() để đánh giá một biểu thức số học. JavaScript tự động đánh giá các biểu thức số học |