2011-11-02 39 views
12

Tôi đã thử mã này JavaScript đơn giản:Eval() = thẻ bất ngờ: Lỗi

eval('{"Topics":["toto","tata","titi"]}') 

Trong giao diện điều khiển Chrome, ví dụ, đây trả

SyntaxError: Unexpected token :

Tôi đã thử các JSON trên JSONLint và nó có hiệu lực.

Bạn có thấy lỗi không?

Trả lời

8

FWIW, sử dụng JSON.parse thay thế. An toàn hơn eval.

8

Số một: Không sử dụng eval.

Số hai. Chỉ sử dụng eval để làm một cái gì đó, cũng được đánh giá. Ví dụ: Ví dụ:

eval('var topics = {"Topics":["toto","tata","titi"]}'); 
4

Vì đó là đánh giá một đối tượng. eval() yêu cầu bạn chuyển vào javascript hợp lệ cú pháp, và tất cả những gì bạn đang làm là truyền vào một đối tượng trống. Cuộc gọi nên được nhiều hơn như:

eval('var x = {"Topics":etc...}'); 
26

evalkhông lực một bối cảnh biểu hiện và chuỗi cung cấp là một chương trình không hợp lệ JavaScript, do đó ba thẻ đầu tiên (và cách thức chúng được nhìn) là :

{   // <-- beginning of a block, and NOT an Object literal 
"Topics"  // <-- string value, okay (note this is NOT a label) 
:   // <-- huh? expecting ";" or "}" or an operator, etc. 

Mã hóa hạnh phúc.

+0

tôi có thể hỏi bạn tại sao eval ('function() {}') ném một ngoại lệ không? – BiAiB

+4

@BiAiB Vì lý do tương tự như trên :) Nội dung của 'eval' chạy trong ngữ cảnh * statement * và do đó nó được xem như là một cấu trúc ngữ pháp FunctionDeclaration. Lỗi được tạo ra bởi đó là "Cú pháp cú pháp: câu lệnh hàm cần một tên". Hoặc đặt tên cho nó ('eval ('function f() {}'); f()') hoặc ép nó vào một cấu trúc FunctionExpression ('f = eval ('(function() {alert (" hi ")}) '); f() '). Xem http://es5.github.com/x13.html –

+0

cảm ơn! phần khó khăn đối với tôi là vì các chuỗi như '3' được đánh giá đúng và không phải là 'hàm() {}'. Thứ hai không thể được đánh giá như là một ExpressionStatement: 'một ExpressionStatement không thể bắt đầu với từ khóa chức năng vì điều đó có thể làm cho nó mơ hồ với một FunctionDeclaration' (http://es5.github.com/x12.html#x12.4) – BiAiB

4

SỬ DỤNG:

function evalJson(jsArray){ eval("function x(){ return "+ jsArray +"; }"); return x(); } 

var yourJson =evalJson('{"Topics":["toto","tata","titi"]}'); 

console.log(yourJson.Topics[1]); // print 'tata'' 
+0

hoạt động cho tôi..không biết nếu đó là thực hành tốt nhất, nhưng nó đã cho tôi và chạy – Patrick

+0

bình chọn cho sự đơn giản – bresleveloper

26

Bạn phải viết như

eval('('+stingJson+')'); 
này

để chuyển đổi một chuỗi vào Object

Hy vọng tôi giúp đỡ!

+2

Đây là giải pháp duy nhất hoạt động trong trường hợp của tôi. Cảm ơn bạn! –

+1

thx, điều này tốt hơn nhiều so với câu trả lời được chấp nhận. Nó là tốt để chỉ ra rằng eval là ác :), nhưng vẫn còn, điều này trả lời câu hỏi. – apocalypz

+0

Excelent! Chơi lô tô! –

0

nếu bạn đang sử dụng JQuery sử dụng chức năng $.parseJSON(), làm việc cho tôi, có cùng một vấn đề

Các vấn đề liên quan