2016-04-26 8 views
1

一部の文字列は、new Function(...)呼び出しによって関数に変換されます。新しい関数の中にarguments.calleeを置き換えます。

arguments.calleeを使用せずに文字列の内部でこの関数を参照するにはどうすればよいですか?

var f = new Function('return arguments.callee.smth'); 
f.smth = 128; 
f(); // 128 
+2

あなたがすることはできません。なぜあなたはこれを行う必要がありますか( 'Function'コンストラクタは何を使用していますか?)問題に適したソリューションを提案できるように、実際のコードを入力してください。 – Bergi

+0

構築された関数のスコープに値を渡すための[このアプローチ](http://stackoverflow.com/a/24032179/1048572)を見てください。 – Bergi

+1

@Bergi、実際に私は[関数を拡張したい](// stackoverflow.com/q/36871299/4928642)、生成された関数自身による自己参照の取得についての考えは私にとっては興味深いようです。 – Qwertiy

答えて

0

このようなことを行う唯一の方法は、クロージャを使用することです。例えば

var f = (function() { 
    var f = new Function('return this().smth').bind(function() { return f }); 
    return f; 
})(); 

f.smth = 128; 
f(); 

またはSO:

var f = (function (g) { 
    return function f() { 
    return g.apply(f, arguments) 
    }; 
})(new Function('return this.smth')); 

f.smth = 128; 
f(); 

とにかく、内部strictモードに関係なく、機能を構築arguments.callee作品のように思えます。トピックについて

追加リンク:

+2

'new Function()'ではなく、 'bound function '(' .prototype'を持たない)を返します。あなたはそれをもっと簡単に得ることができました:-) – Bergi

+0

@Bergi、_ "それはもっと簡単になりました:-)" - どのように? – Qwertiy

+2

'new Function'を廃止し、単に関数式から作成したクロージャを返すことによって、私は意味します。 – Bergi

関連する問題