0
function foo() {
    if (arguments.callee.self)
        return arguments.callee.self;
    arguments.callee.self = this;
    //do sth
}

私はそれがこのように呼ばれるときを理解しています:

var a = foo();

fooが実行されると、arguments.calleeはfoo自体になります。したがって、これを未定義の変数selfに渡します。次回、別の関数がfooを呼び出すと、これが返されます。明らかにこれはうまくいくでしょう。

このように呼ばれると、物事はより巧妙になるようです:

var b = new foo();

私が思うに、jsエンジンはfooの別のインスタンスを作成し、そのコードを実行します。しかし、selfはfooの同じインスタンスのようにすでに定義されているため、この参照を返すようです。では、ここで実際に「新しい」とは何をするのでしょうか。

4

1 に答える 1

3

new関数をコンストラクターとして呼び出します。ターゲット関数が明示的にオブジェクトを返す場合、作成されたばかりのオブジェクトではなく、そのオブジェクトが返されます。

このコードを非厳密モードで実行しているため、関数は最初の呼び出し後にグローバルオブジェクトを明示的に返すため、新しく作成されたオブジェクトは返されません。new foo()

于 2012-06-08T06:55:47.707 に答える