2012-05-06 39 views
20

Tôi biết đây có thể là một câu hỏi mới, nhưng tôi tò mò về lợi ích chính của eval() - nơi nào nó sẽ được sử dụng tốt nhất? Tôi đánh giá cao bất kỳ thông tin nào.Lợi ích chính của việc sử dụng eval() trong JavaScript là gì?

+3

thể trùng lặp của [Có bao giờ là một lý do chính đáng để sử dụng eval()?] (Http://stackoverflow.com/questions/1826859/is-there-ever-a-good-reason-to-use-eval) –

+1

Tại sao thẻ này được gắn thẻ 'bài tập về nhà'? –

+0

@Derek - cảm ơn, đã sửa – Coffee

Trả lời

23

Chức năng eval được sử dụng tốt nhất: Không bao giờ.

Mục đích của việc đánh giá chuỗi là biểu thức Javascript. Ví dụ:

eval('x = 42'); 

Nó đã được sử dụng rất nhiều trước đây, vì nhiều người không biết viết mã thích hợp cho những gì họ muốn làm. Ví dụ khi sử dụng một tên năng động cho một lĩnh vực:

eval('document.frm.'+frmName).value = text; 

Cách thích hợp để làm điều đó sẽ là:

document.frm[frmName].value = text; 

Là phương pháp eval thực thi chuỗi như mã, mỗi khi nó được sử dụng là một tiềm năng mở cho ai đó để tiêm mã độc hại trong trang. Xem cross-site scripting.

Có một vài cách sử dụng hợp pháp cho chức năng eval.Tuy nhiên, có khả năng bạn sẽ không bao giờ ở trong tình huống mà bạn thực sự cần đến.

7

eval() không được sử dụng trong Javascript.

eval() được sử dụng để phân tích cú pháp các chuỗi JSON, nhưng việc sử dụng đó đã bị thay thế bởi số JSON.parseJSON nhanh hơn và an toàn hơn.

+0

Ah, tôi hiểu - vì vậy nó là một chức năng nguy hiểm - tôi sẽ đọc thêm. Cảm ơn bạn, – Coffee

+1

Hàm 'eval' đã được sử dụng cho rất nhiều thứ trước khi JSON tồn tại ... – Guffa

+2

@Guffa: Vâng, nhưng không nên. – SLaks

2

Bạn có thể chạy JS được lưu trữ trong giá trị của một trường trên trang web.

Bạn có thể sử dụng eval với JS, nó chỉ là sau đó mã của bạn là khả thi hơn để tấn công. Miễn là nó không sử dụng AJAX, không có vấn đề về máy chủ.

Nếu bạn sử dụng eval, bạn nên phân tích ra các ký tự [() <> {}]

+4

Và đó thường là một ý tưởng khủng khiếp. – SLaks

+0

Các thư viện JS quảng bá làm việc đó mọi lúc, vì vậy nó phải là thực hành tốt! –

+0

Nó không phải là xấu miễn là bạn không sử dụng nó nguyên – PitaJ

1

eval() = evil

Bạn nên không thực sự sử dụng nó ở tất cả. Nó có thể được sử dụng để chèn mã dễ dàng, nhưng ai đó có thể chèn tập lệnh xấu bằng cách sử dụng eval(). Đôi khi người sử dụng eval() cho phân tích cú pháp JSON, hoặc

eval("obj." + id); //newbies 

nhưng thực sự bạn có thể đạt được tất cả những điều mà không sử dụng eval().

obj[id];    //should-do 
+0

Chúng ta đều biết rằng bạn không nên sử dụng 'eval'; OP đã hỏi liệu có bất kỳ lợi ích nào không. –

+0

@JeffreySweeney - (không có bất kỳ người trong số họ tôi có thể nghĩ đến ...) –

+0

Tôi biết đúng không? : P Có lẽ nó có thể được sử dụng để kiểm tra lỗ hổng back-end trên một máy chủ thử nghiệm, hoặc để kiểm tra tốc độ (vì nó là một trong những hàm chậm nhất trong JS). –

7

eval làm cho nó có thể thực hiện (hoặc đánh giá) một chuỗi mã javascript.

Do đó, nó có thể áp dụng khi bạn muốn ai đó thực thi một chuỗi mã javascript. Chẳng hạn như, theo một bài viết về JavaScript, vì vậy người đọc có thể ngay lập tức thử nó :)

Hoặc, nếu trang web của bạn được nhắm mục tiêu đến người lập trình, bạn có thể muốn họ viết và thực thi các plugin của riêng họ.

2

Mục tiêu tốt nhất của việc sử dụng eval là tải động mã, tạo mã khi chạy và thực hiện các công cụ lập trình meta tương tự. Nói chung, nếu bạn có thể làm tương tự mà không có eval, không sử dụng eval.

0

một trong những trường hợp sử dụng tốt nhất khi sử dụng eval là trình ghi nhật ký javascript, trong đó người dùng có thể thực thi javascript trong thời gian chạy. ví dụ javascript logger cho phép người dùng thực thi tập lệnh trong cửa sổ nhật ký.

0

bạn có thể xây dựng bộ xương khách và làm cho nó hoạt động như một ứng dụng nền tảng - nhận gói mã và sau đó thực thi chúng - do đó làm cho máy khách cực kỳ linh hoạt - có tất cả mã trên máy chủ trong các gói. Tuy nhiên điều này là rất nguy hiểm và nếu một điều như vậy là cần thiết, thì có lẽ bạn nên sử dụng Java với các gói Java. Tại sao Eval vẫn còn trong ngôn ngữ có thể tranh cãi, nó là một nguy cơ bảo mật quá lớn để sử dụng

2

Như đã nói ở trên, có nguy cơ tiềm ẩn khi sử dụng eval(), Nếu bạn muốn đánh giá chuỗi như biểu thức có thể sử dụng $ {} để đánh giá biểu thức, được giới thiệu trong ECMA-6

11

Đây là câu hỏi khá cũ và có lẽ mọi người không nghĩ đến trường hợp sử dụng cho eval() đúng lúc đó. Sử dụng tuyệt vời cho eval() là để triển khai tải lại nóng vào luồng phát triển chương trình phụ trợ hoặc lối vào của bạn.

Về cơ bản eval() có thể làm cho bạn có thể chỉnh sửa mã trong trình chỉnh sửa của mình và sửa lỗi ứng dụng đang chạy mà không cần khởi động lại và không mất trạng thái (tùy thuộc vào việc triển khai). Bạn sẽ cần mã liên quan để theo dõi các thay đổi của tệp và bằng cách nào đó gửi các thay đổi cho ứng dụng của bạn, nhưng eval() là phương pháp chuyển đổi những thay đổi đó thành js thực tế.


Trên lưu ý đó, tôi nghĩ hoàn toàn sai khi viết tuyên bố như eval() là điều ác hoặc không bao giờ được sử dụng. Báo cáo về chăn như thế này là ác thật!

+0

Đây là trường hợp sử dụng tốt nhất và thực tế mà tôi gặp phải. (y) – Ravi

+0

Câu trả lời gọn gàng. Nếu ai đó đang xây dựng một thứ gì đó như ReactJS hoặc Angular hoặc NodeJS, câu trả lời này sẽ hữu ích. =) – HoldOffHunger

0

Có lẽ tôi sai, nhưng tôi đang sử dụng nó để chuyển đổi một chuỗi cổ điển thành một ES6 mẫu chuỗi:

let name = 'Daman' 
let classicString = 'Hello ${name}' 
let templateString = eval('`' + classicString + '`') 

nào mang lại cho tôi chỉ là những gì tôi cần:

"Hello Daman" 
Các vấn đề liên quan