Cảnh báo. Thực thi JavaScript từ một chuỗi là một rủi ro bảo mật rất lớn. Quá dễ dàng để kẻ xấu chạy mã tùy ý khi bạn sử dụng eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5. Xem Không bao giờ sử dụng eval(). , phía dướiHàm eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 đánh giá mã JavaScript được biểu thị dưới dạng chuỗi và trả về giá trị hoàn thành của nó. Nguồn được phân tích cú pháp dưới dạng tập lệnhThông sốeval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
7Một chuỗi đại diện cho một biểu thức JavaScript, câu lệnh hoặc chuỗi các câu lệnh. Biểu thức có thể bao gồm các biến và thuộc tính của các đối tượng hiện có. Nó sẽ được phân tích cú pháp dưới dạng tập lệnh, do đó, khai báo eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
8 (chỉ có thể tồn tại trong mô-đun) không được phépGiá trị trả vềGiá trị hoàn thành của việc đánh giá mã đã cho. Nếu giá trị hoàn thành trống, eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
9 được trả về. Nếu eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
7 không phải là một chuỗi nguyên thủy, thì eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 trả về đối số không thay đổingoại lệNém bất kỳ ngoại lệ nào xảy ra trong quá trình đánh giá mã, bao gồm cả const expression = new String("2 + 2");
eval(String(expression)); // returns 4
2 nếu eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
7 không được phân tích cú pháp dưới dạng tập lệnhSự miêu tảeval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 là một thuộc tính chức năng của đối tượng toàn cầuĐối số của hàm eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 là một chuỗi. Nó sẽ đánh giá chuỗi nguồn dưới dạng phần thân tập lệnh, có nghĩa là cả câu lệnh và biểu thức đều được phép. Nó trả về giá trị hoàn thành của mã. Đối với các biểu thức, đó là giá trị mà biểu thức đánh giá. Nhiều câu lệnh và khai báo cũng có giá trị hoàn thành, nhưng kết quả có thể gây bất ngờ (ví dụ: giá trị hoàn thành của một phép gán là giá trị được gán, nhưng giá trị hoàn thành của const expression = new String("2 + 2");
eval(String(expression)); // returns 4
6 là không xác định), vì vậy không nên dựa vào các câu lệnh' Ở chế độ nghiêm ngặt, việc khai báo một biến có tên là const expression = new String("2 + 2");
eval(String(expression)); // returns 4
7 hoặc gán lại const expression = new String("2 + 2");
eval(String(expression)); // returns 4
7 là một biến const expression = new String("2 + 2");
eval(String(expression)); // returns 4
2eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
6Nếu đối số của eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 không phải là một chuỗi, thì eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 trả về đối số không thay đổi. Trong ví dụ sau, việc truyền đối tượng eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
92 thay vì đối tượng nguyên thủy khiến eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 trả về đối tượng eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
92 thay vì đánh giá chuỗieval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
Để giải quyết vấn đề theo cách chung chung, bạn có thể tự ép đối số vào một chuỗi trước khi chuyển nó tới eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5________số 8 Đánh giá trực tiếp và gián tiếpCó hai chế độ của cuộc gọi eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5. đánh giá trực tiếp và đánh giá gián tiếp. Đánh giá trực tiếp chỉ có một hình thức. eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
97 (tên của hàm được gọi là const expression = new String("2 + 2");
eval(String(expression)); // returns 4
7 và giá trị của nó là hàm const expression = new String("2 + 2");
eval(String(expression)); // returns 4
7 toàn cầu). Mọi thứ khác, bao gồm cả việc gọi nó thông qua một biến bí danh, thông qua quyền truy cập thành viên hoặc biểu thức khác hoặc thông qua toán tử chuỗi tùy chọn eval(script)
90, đều là gián tiếpeval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
9Đánh giá gián tiếp có thể được xem như thể mã được đánh giá trong một thẻ eval(script)
91 riêng biệt. Điều này có nghĩa là- Giá trị gián tiếp hoạt động trong phạm vi toàn cầu thay vì phạm vi cục bộ và mã được đánh giá không có quyền truy cập vào các biến cục bộ trong phạm vi mà nó được gọi
eval(script)
9 - Gián tiếp
const expression = new String("2 + 2");
eval(String(expression)); // returns 4
7 sẽ không kế thừa tính nghiêm ngặt của ngữ cảnh xung quanh và sẽ chỉ ở chế độ nghiêm ngặt nếu bản thân chuỗi nguồn có chỉ thị eval(script)
93eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5Mặt khác, eval trực tiếp kế thừa tính nghiêm ngặt của ngữ cảnh gọieval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
6 - Khai báo hàm và biến được khai báo
eval(script)
94 sẽ đi vào phạm vi xung quanh nếu chuỗi nguồn không được diễn giải ở chế độ nghiêm ngặt - đối với eval gián tiếp, chúng trở thành biến toàn cục. Nếu đó là một eval trực tiếp trong ngữ cảnh chế độ nghiêm ngặt hoặc nếu chính chuỗi nguồn const expression = new String("2 + 2");
eval(String(expression)); // returns 4
7 ở chế độ nghiêm ngặt, thì các khai báo hàm và eval(script)
94 không "rò rỉ" vào phạm vi xung quanheval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
0Các khai báo const expression = new String("2 + 2");
eval(String(expression)); // returns 4
6 và eval(script)
98 trong chuỗi được đánh giá luôn nằm trong phạm vi tập lệnh đó - Đánh giá trực tiếp có thể có quyền truy cập vào các biểu thức theo ngữ cảnh bổ sung. Ví dụ, trong phần thân của hàm, người ta có thể sử dụng
eval(script)
99eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
4
Không bao giờ sử dụng eval()Sử dụng trực tiếp eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 bị nhiều vấn đềeval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 thực thi mã nó được chuyển với các đặc quyền của người gọi. Nếu bạn chạy eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 với một chuỗi có thể bị ảnh hưởng bởi một bên độc hại, bạn có thể sẽ chạy mã độc hại trên máy của người dùng với quyền của trang web/tiện ích mở rộng của bạn. Quan trọng hơn, việc cho phép mã của bên thứ ba truy cập phạm vi mà trong đó eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 được gọi (nếu đó là một đánh giá trực tiếp) có thể dẫn đến các cuộc tấn công có thể đọc hoặc thay đổi các biến cục bộeval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 chậm hơn so với các giải pháp thay thế, vì nó phải gọi trình thông dịch JavaScript, trong khi nhiều cấu trúc khác được tối ưu hóa bởi các công cụ JS hiện đại- Trình thông dịch JavaScript hiện đại chuyển đổi JavaScript thành mã máy. Điều này có nghĩa là mọi khái niệm về cách đặt tên biến đều bị xóa sạch. Do đó, bất kỳ việc sử dụng
eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 nào cũng sẽ buộc trình duyệt thực hiện tra cứu tên biến tốn kém dài để tìm ra vị trí tồn tại của biến trong mã máy và đặt giá trị của nó. Ngoài ra, những điều mới có thể được đưa vào biến đó thông qua eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5, chẳng hạn như thay đổi loại biến đó, buộc trình duyệt phải đánh giá lại tất cả mã máy được tạo để bù lại - Công cụ khai thác từ bỏ bất kỳ hoạt động thu nhỏ nào nếu phạm vi phụ thuộc quá độ vào bởi ________ 05, vì nếu không thì ________ 05 không thể đọc đúng biến trong thời gian chạy
Có nhiều trường hợp việc sử dụng eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 hoặc các phương pháp liên quan có thể được tối ưu hóa hoặc tránh hoàn toànSử dụng gián tiếp eval()Hãy xem xét mã này eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
60Chỉ cần sử dụng eval gián tiếp và buộc chế độ nghiêm ngặt có thể làm cho mã tốt hơn nhiều eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
61Hai đoạn mã trên dường như hoạt động theo cùng một cách, nhưng chúng thì không; - Nó chậm hơn rất nhiều, do kiểm tra phạm vi nhiều hơn. Lưu ý
eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
60 trong chuỗi được đánh giá. Trong phiên bản đánh giá gián tiếp, đối tượng đang được đánh giá trong phạm vi toàn cầu, do đó, trình thông dịch giả định rằng eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
61 đề cập đến hàm tạo toàn cầu eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
62 thay vì một biến cục bộ có tên là eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
61. Tuy nhiên, trong mã sử dụng eval trực tiếp, trình thông dịch không thể giả sử điều này. Ví dụ: trong đoạn mã sau, eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
61 trong chuỗi được đánh giá không đề cập đến eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
65eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
62Do đó, trong phiên bản mã eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5, trình duyệt buộc phải thực hiện cuộc gọi tra cứu tốn kém để kiểm tra xem liệu có bất kỳ biến cục bộ nào được gọi là eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
62 - Nếu không sử dụng chế độ nghiêm ngặt, các khai báo
eval(script)
94 trong nguồn eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 sẽ trở thành các biến trong phạm vi xung quanh. Điều này dẫn đến các vấn đề khó gỡ lỗi nếu chuỗi được lấy từ đầu vào bên ngoài, đặc biệt nếu có một biến hiện có cùng tên - eval trực tiếp có thể đọc và biến đổi các liên kết trong phạm vi xung quanh, điều này có thể dẫn đến đầu vào bên ngoài làm hỏng dữ liệu cục bộ
- Khi sử dụng
const expression = new String("2 + 2");
eval(String(expression)); // returns 4
7 trực tiếp, đặc biệt khi nguồn eval không thể được chứng minh là ở chế độ nghiêm ngặt, công cụ — và công cụ xây dựng — phải vô hiệu hóa tất cả các tối ưu hóa liên quan đến nội tuyến, vì nguồn eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 có thể phụ thuộc vào bất kỳ tên biến nào trong phạm vi xung quanh của nó
Tuy nhiên, việc sử dụng eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 gián tiếp không cho phép chuyển các ràng buộc bổ sung ngoài các biến toàn cục hiện có để nguồn được đánh giá đọc. Nếu bạn cần chỉ định các biến bổ sung mà nguồn được đánh giá sẽ có quyền truy cập, hãy cân nhắc sử dụng hàm tạo eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
03Sử dụng hàm tạo Function()Hàm tạo eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
03 rất giống với ví dụ gián tiếp eval ở trên. nó cũng đánh giá nguồn JavaScript được truyền cho nó trong phạm vi toàn cầu mà không cần đọc hoặc thay đổi bất kỳ ràng buộc cục bộ nào và do đó cho phép các công cụ thực hiện nhiều tối ưu hóa hơn so với eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 trực tiếpSự khác biệt giữa eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 và eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
03 là chuỗi nguồn được chuyển đến eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
03 được phân tích dưới dạng thân hàm, không phải dưới dạng tập lệnh. Có một số sắc thái — ví dụ: bạn có thể sử dụng các câu lệnh eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
09 ở cấp cao nhất của thân hàm, nhưng không phải trong tập lệnhHàm tạo eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
03 rất hữu ích nếu bạn muốn tạo các liên kết cục bộ trong nguồn eval của mình, bằng cách chuyển các biến dưới dạng các liên kết tham sốeval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
63Cả eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 và eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
03 đều đánh giá ngầm mã tùy ý và bị cấm trong cài đặt CSP nghiêm ngặt. Ngoài ra còn có bổ sung an toàn hơn (và nhanh hơn. ) các lựa chọn thay thế cho eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 hoặc eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
03 cho các trường hợp sử dụng phổ biếnSử dụng phụ kiện khungBạn không nên sử dụng eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 để truy cập các thuộc tính một cách linh hoạt. Xem xét ví dụ sau trong đó thuộc tính của đối tượng được truy cập không được biết cho đến khi mã được thực thi. Điều này có thể được thực hiện với eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
64Tuy nhiên, eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 không cần thiết ở đây — trên thực tế, nó dễ bị lỗi hơn, bởi vì nếu eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
48 không phải là mã định danh hợp lệ, nó sẽ dẫn đến lỗi cú pháp. Ngoài ra, nếu eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
49 không phải là chức năng bạn kiểm soát, điều này có thể dẫn đến việc thực thi mã tùy ý. Thay vào đó, hãy sử dụng các trình truy cập thuộc tính, nhanh hơn và an toàn hơn nhiềueval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
65Bạn thậm chí có thể sử dụng phương pháp này để truy cập các thuộc tính hậu duệ. Sử dụng eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5, điều này sẽ giống nhưeval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
66Việc tránh eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 ở đây có thể được thực hiện bằng cách tách đường dẫn thuộc tính và lặp qua các thuộc tính khác nhaueval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
67Đặt thuộc tính theo cách đó hoạt động tương tự eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
68Tuy nhiên, hãy lưu ý rằng việc sử dụng các bộ truy cập khung với đầu vào không bị ràng buộc cũng không an toàn — nó có thể dẫn đến các cuộc tấn công tiêm đối tượng Sử dụng gọi lạiJavaScript có các hàm hạng nhất, nghĩa là bạn có thể chuyển các hàm làm đối số cho các API khác, lưu trữ chúng trong các biến và thuộc tính của đối tượng, v.v. Nhiều API DOM được thiết kế với ý tưởng này, vì vậy bạn có thể (và nên) viết eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
69Các bao đóng cũng hữu ích như một cách để tạo các hàm được tham số hóa mà không cần nối các chuỗi Sử dụng JSONNếu chuỗi bạn đang gọi eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 có chứa dữ liệu (ví dụ: một mảng. eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
603), trái ngược với mã, bạn nên cân nhắc chuyển sang JSON, điều này cho phép chuỗi sử dụng một tập hợp con cú pháp JavaScript để biểu thị dữ liệuLưu ý rằng vì cú pháp JSON bị giới hạn so với cú pháp JavaScript, nhiều chữ JavaScript hợp lệ sẽ không phân tích dưới dạng JSON. Ví dụ: không được phép sử dụng dấu phẩy ở cuối trong JSON và tên thuộc tính (khóa) trong ký tự đối tượng phải được đặt trong dấu ngoặc kép. Đảm bảo sử dụng trình tuần tự hóa JSON để tạo các chuỗi mà sau này sẽ được phân tích cú pháp dưới dạng JSON Truyền dữ liệu bị ràng buộc cẩn thận thay vì mã tùy ý nói chung là một ý tưởng hay. Ví dụ: một tiện ích mở rộng được thiết kế để cạo nội dung của các trang web có thể có quy tắc cạo được xác định trong XPath thay vì mã JavaScript Sử dụng eval()Trong đoạn mã sau, cả hai câu lệnh chứa eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 đều trả về 42. Đầu tiên đánh giá chuỗi eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
605; eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
0eval() trả về giá trị hoàn thành của câu lệnheval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 trả về giá trị hoàn thành của câu lệnh. Đối với eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
608, nó sẽ là biểu thức hoặc câu lệnh cuối cùng được đánh giáeval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
1Ví dụ sau sử dụng eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 để đánh giá chuỗi eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
610. Chuỗi này bao gồm các câu lệnh JavaScript gán giá trị 42 cho eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
611 nếu eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
612 là năm và gán 0 cho eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
611 nếu ngược lại. Khi câu lệnh thứ hai được thực thi, eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
5 sẽ khiến các câu lệnh này được thực hiện và nó cũng sẽ đánh giá tập hợp các câu lệnh và trả về giá trị được gán cho eval(new String("2 + 2")); // returns a String object containing "2 + 2"
eval("2 + 2"); // returns 4
611, bởi vì giá trị hoàn thành của một phép gán là giá trị được gán
Tôi có thể sử dụng cái gì thay vì eval() trong JavaScript?
Câu hỏi. Phương pháp 'eval' trong JavaScript/DemandwareScript không được dùng nữa dựa trên các rủi ro bảo mật tiềm ẩn khi sử dụng phương pháp này vì phương pháp này không thoát khỏi các tham số đầu vào. Câu trả lời. Thay vào đó, bạn nên sử dụng ' Hàm mới ()'.
Tại sao chúng ta không nên sử dụng eval trong JavaScript?
Mã độc hại . gọi eval có thể làm hỏng máy tính. Ví dụ. nếu bạn sử dụng phía máy chủ eval và một người dùng tinh nghịch quyết định sử dụng một vòng lặp vô hạn làm tên người dùng của họ. chậm khủng khiếp. ngôn ngữ JavaScript được thiết kế để sử dụng đầy đủ các loại JavaScript (số, hàm, đối tượng, v.v.)… Không chỉ các chuỗi.
Làm cách nào để gọi một hàm JavaScript từ một chuỗi mà không cần sử dụng eval?
var params = "praveen. khoa học" // Bây giờ hãy gọi hàm mà không sử dụng eval. cửa sổ [fnName](params); Điều này cũng có thể hữu ích để gọi các chức năng của Google Apps Script.
eval() trong JavaScript là gì?
eval() là một thuộc tính hàm của đối tượng toàn cục . Đối số của hàm eval() là một chuỗi. Nó sẽ đánh giá chuỗi nguồn dưới dạng phần thân tập lệnh, có nghĩa là cả câu lệnh và biểu thức đều được phép. Nó trả về giá trị hoàn thành của mã. Đối với các biểu thức, đó là giá trị mà biểu thức đánh giá. |