0

これは可能ですか?(私はそれが機能する方法を見つけることができませんでした)

var foo = function() 
{ 
    console.log("Original Function");
    this = function() 
    {
        console.log("New Function");
    }
};
console.log("Calling foo()");
foo();

望ましい出力:

オリジナル機能

foo() の呼び出し

新機能

事前に質問に答えるために、はい、これを行う他の方法があることを知っています. 追加の機能なしで、時間に依存するプロパティを自分自身に割り当てることができるかどうかに興味がありvar bar = new foo();ます。foo()

編集:ヒトカゲの質問への回答、およびやや単純化されていない、より実用的なアプリケーション

var node = function(parent)
{
    this = function()
    {
        for (i in this)
        {
            // perform actions (which will occasionally include calling i()
        }
    }
    if (parent !== null)
    {
        this.parent = parent;
        // code to determine children
        this.somechild = new node(this);
        this.someotherchild = new node(this);
    }
};
var ancestor = new node(new node(null));
4

3 に答える 3

2

この手法を使用する場合は、外部関数変数に直接割り当てる必要があります。

var foo = function() 
{ 
    console.log("Original Function");
    foo = function() 
    {
        console.log("New Function");
    };
};

関数の複数の独立したコピーが存在できるように、関数が格納場所を認識できない場合は、本当にクロージャ ファクトリを使用する必要があります。

function makeReplacingFunction() {
    var fn;

    fn = function() {
        console.log("Original Function");
        fn = function() {
            console.log("New Function");
        };
    };

    return function() { fn(); }
}

var foo = makeReplacingFunction();
foo();
foo();
于 2012-10-06T19:48:06.510 に答える
2

に新しい値を割り当ててthisも機能しませんが、単純に関数を返すことができます:

var foo = function() { 
    console.log("Original Function");
    return function() {
        console.log("New Function");
    };
};

console.log("Calling foo()");
var f = foo(); /* or even: f = new foo(); */
f();
于 2012-10-06T19:48:42.543 に答える
0

Yes, but you don't do it by assigning to this:

function foo() {
  console.log("original");
  foo = function() {
    console.log("new");
  };
}

All that's doing is assigning a new value to the global symbol "foo", such that the new value happens to be a function.

Thus when you call foo() twice, it'll print "original" the first time and "new" every time thereafter.

The value of this is usually not the value of the function in which it's referenced; it can be, but you'd sort of have to set up a somewhat unusual situation. Even if it were, you can't assign a new value to this.

于 2012-10-06T19:45:43.220 に答える