evalとnew Function

1495 ワード

もっと読む
[size=large][size=large][size=x-large][size=large][size=medium]jquery ajaxがdataTypeをjsonに指定した後、コールバック関数の戻り値がjsonに変換できない場合、errorに入ります.evalとnew Function()メソッドを使用して、jsonタイプの文字列をjsonオブジェクトに変換することができます.
eval("("+json+")")
(new Function("","return "+json))()
なぜevalに「(」+data[size=large]//」を追加しますか?
理由は、エヴァ自体の問題です.jsonは「{}」で始まり、終わりますので、JSでは語句のブロックとして扱われますので、強制的に表現に変換しなければなりません.
括弧を加える目的は、JavaScriptコードを処理する際に、文としてではなくeval関数を対象に強制的に括弧内の表現をオブジェクトに変換することです.一例として、例えばオブジェクトの字面量{}が、外側の括弧を加えないと、evalは、大きな括弧をJavaScriptコードブロックの開始及び終了フラグとして認識し、{}は空の文を実行したと見なされる.
したがって、以下の二つの実行結果は異なる.
alert(eval_r("{}"); // return undefined
alert(eval_r("({})");// return object[Object]
new Function()はなぜオブジェクトを変換できますか?
function sayHi(sName, sMessage) {
  alert("Hello " + sName + sMessage);
}
次のような形に変換できます.
var sayHi 
= 
new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");
では、(new Function(「」、「return」+json)とは、次のような意味です.
(function xx(){
  return json;
})()
jsonは文字列なので、returnとつなぎ合わせて、''a':1,'b':2'''='''return''a':1,'b':2''
関数実行後、Jsonオブジェクト[/size][/size][/size][/size]を返します.