1
var foo = (function(){
  var x = "bar";
  return function(){
    console.log(x);
  };
})();

console.log(foo.toString()); // function() {console.log(x);}

(foo)(); // 'bar'
eval('(' + foo.toString()+')()')); // error: x is undefined

varが のようにx記録され"bar"ないのはなぜfoo.toString()ですか?

fooその toString() 値と一致しない動作があります。foo常に「バー」を出力しますが、見ただけでfoo.toString()はわかりません。

これに関連していますか?関数を逆コンパイルしてその toString() 値を取得しないという決定が下された場合、外部関数のスコープに依存するオブジェクトの解決を含めてみませんか?

逆コンパイルの古い方法を使用して、特定の関数の背後にある実際のコードを取得する方法はありますか?

4

2 に答える 2

3

匿名関数を実行しているため、戻り値は に割り当てられfooます。使用する場合

var foo = function(){
  var x = "bar";
  return function(){
    console.log(x);
  };
};

foo.toString()無名関数と返さ
foo().toString()れる関数を示します

Yourは1evalから新しい関数を作成しますが、[作成した無名関数の]初期スコープのスコープとはまったく関係がなく、それを実行するため、懸念される . それについて奇妙なことは何もありません。foo.toString()fooReferenceErrorx

1 eval("function (){console.log(x);})()")

于 2013-02-25T08:07:03.457 に答える