1

はい、私は評価が悪であることを知っていますが...

いくつかの異なる方法で文字列から関数が作成されているのを見たことがあります。

var s = "function fname() { this.m = function(s){alert(s);}}";

//1
var x = new( eval("("+s+")") );
x.m("aaa")

//2
var x = new( eval('[' + s + ']')[0] );
x.m("bbb")

//3
var x = new ( eval(s + " fname;") );
x.m("ccc")

最初の2つは私には明らかですが、3つ目については疑問に思います。関数の定義の後に関数の名前を追加すると、evalがその仕事をするのにどのように役立つかを誰かが説明できますか?また、evalを使用して関数を作成する他の方法を知っていますか?

ありがとうSzymon

4

2 に答える 2

1

まず、function宣言(式ではありません)を使用して、関数を作成し、それを現在のスコープに配置します。

function fname() { ... }

閉じ中括弧は関数ステートメントを終了し、式は次のとおりです。

fname

関数はすでにスコープ内にあるため、式fnameは単に関数を参照します。また、式は評価されたコードの最後のものであるため、eval正確にその関数参照を返します。

の代わりにfname、現在のスコープ内の任意の関数の名前を書き込むことができます。たとえばalert、。は、によって返されevalます。

于 2012-08-05T18:55:01.573 に答える
0
function fname() { this.m = function(s){alert(s);}}

関数宣言です。Evalはそれを作成しますが、それを返しません。そのため、その後、関数参照に評価するだけの別のステートメントが追加されます。

他の2つの例では、それ自体が参照に対して評価される関数式(角かっこで囲まれた、または配列リテラル内)になります。

于 2012-08-05T18:56:09.857 に答える