Hàm gọi javascript theo chuỗi
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 5. Xem Không bao giờ sử dụng eval(). , phía dưới Show
Hàm 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ử nócú pháp
Thông số 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 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, 9 được trả về. Nếu 7 không phải là một chuỗi nguyên thủy, thì 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ả 2 nếu 7 không được phân tích cú pháp dưới dạng tập lệnhSự mô tả 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 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 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à 7 hoặc gán lại cho 7 là một biến 2 6Nếu đối số của 5 không phải là một chuỗi, thì 5 trả về đối số không thay đổi. Trong ví dụ sau, việc truyền đối tượng 92 thay vì đối tượng nguyên thủy khiến 5 trả về đối tượng 92 thay vì đánh giá chuỗi
Để 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 5________số 8 Đánh giá trực tiếp và gián tiếpCó hai chế độ của cuộc gọi 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. 97 (tên của hàm được gọi là 7 và giá trị của nó là hàm 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 90, đều là gián tiếp 9Đánh giá gián tiếp có thể được xem như thể mã được đánh giá trong một thẻ 91 riêng biệt. Điều này có nghĩa là
Không bao giờ sử dụng eval()Sử dụng trực tiếp 5 bị nhiều vấn đề
Có nhiều trường hợp việc sử dụng 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 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 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;
Tuy nhiên, việc sử dụng 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 03Sử dụng hàm tạo Function()Hàm tạo 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 5 trực tiếpSự khác biệt giữa 5 và 03 là chuỗi nguồn được chuyển đến 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 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 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ố 63Cả 5 và 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 5 hoặc 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 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 5 64Tuy nhiên, 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 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 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ều 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 5, điều này sẽ giống như 66Việc tránh 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 nhau 67Đặt thuộc tính theo cách đó hoạt động tương tự 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 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 5 có chứa dữ liệu (ví dụ: một mảng. 603), trái ngược với mã, bạn nên xem xét 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 nối tiếp JSON để tạo các chuỗi 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 ví dụSử dụng eval()Trong đoạn mã sau, cả hai câu lệnh chứa 5 đều trả về 42. Đầu tiên đánh giá chuỗi 605; 0eval() trả về giá trị hoàn thành của câu lệnh 5 trả về giá trị hoàn thành của câu lệnh. Đối với 608, nó sẽ là biểu thức hoặc câu lệnh cuối cùng được đánh giá 1Ví dụ sau sử dụng 5 để đánh giá chuỗi 610. Chuỗi này bao gồm các câu lệnh JavaScript gán giá trị 42 cho 611 nếu 612 là năm và gán 0 cho 611 nếu ngược lại. Khi câu lệnh thứ hai được thực thi, 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 611, bởi vì giá trị hoàn thành của một phép gán là giá trị được gán
Bạn có thể gọi một hàm bằng một chuỗi JavaScript không?Có hai phương pháp để gọi một hàm từ chuỗi được lưu trữ trong một biến. Cách thứ nhất là sử dụng phương thức đối tượng cửa sổ và cách thứ hai là sử dụng phương thức eval() . Phương thức eval() cũ hơn và không được dùng nữa.
3 cách gọi hàm trong JS là gì?Có thể gọi các hàm JavaScript. . Là một chức năng Là một phương pháp Là một nhà xây dựng thông qua cuộc gọi và áp dụng Gọi () trong JavaScript là gì?Phương thức call() là một phương thức JavaScript được xác định trước . Nó có thể được sử dụng để gọi (gọi) một phương thức với đối tượng chủ sở hữu làm đối số (tham số). Với call() , một đối tượng có thể sử dụng một phương thức thuộc đối tượng khác.
Cách gọi hàm JavaScript trực tiếp từ HTML?Cách tiếp cận 1. Đầu tiên, lấy một nút bằng thẻ đầu vào. Sau khi nhấp vào nút, bạn có thể thấy một hộp thoại bật lên trên màn hình đã được khai báo trong hàm JavaScript dưới dạng cảnh báo. Hàm clickEvent() cho phép thực thi cảnh báo() khi nút này được nhấp bằng cách sử dụng phương thức onclick() |