evalはパラメータのカッコを複合文の識別子と見なします


var jsonStr = $('#jsonData').val();  
var json = eval('('+jsonStr+')'); 

上の2行のコードは「jsでPHPのprint_をシミュレートするr機能」から出ており、受信したjson列をjsのオブジェクトに変換するために使用される.json列はすでに完璧なオブジェクトの直接量である以上、なぜ両端に括弧をつけなければならないのか、なぜ以下のように簡単に書けないのか.
var json = eval(jsonStr);

周愛民先生の『JAVACSCRIPT言語の精髄とプログラミング実践』P 264の5.2を見ました.2「動的実行中の文、式、値」がわかります.
 
-----------
の原因となる
-----------
evalは入力パラメータのカッコを複合文の識別と見なします!たとえば
{name: "MyName", value:1}

evalは次の手順で解析されます.
  • の最初のコロンは「ラベル宣言」識別子になった.
  • (「ラベル宣言」の左操作数)nameがラベルになった.
  • 「MyName」は文字列の直接量になった.
  • valueは変数識別子になった.
  • 第2のコロンは合理的に文法分析を行うことができず、文法分析期間の異常が発生した.
  • ……

  •  
    次のコードを実行してみます.
    alert(eval('{value:1}')); //1

    かっこを付けると、オブジェクトを返すことができます.
    alert(eval('({value:1})')); //