1

私はかなりの量の調査を行いましたが、単純な質問のように見えるものに対する答えを見つけることができませんでした:

次のように、プロパティを関数に関連付けたい (この関数で静的変数として使用する)。

function foo() {
    if (!foo.counter) {
        foo.counter = 1;
    }
    else {
        foo.counter++
    }
    // rest of the function code goes here...
}

後で関数の名前を変更する場合、関数定義内で参照を変更する必要はありません。では、現在実行中の関数を参照する方法はありますか? (それ以外arguments.calleeは現在非推奨です)。のようなキーワードthisFunction

そうでない場合、このようなものがない理由は何ですか?

4

3 に答える 3

3

thisFunctionJavaScriptが公開する(以外の)識別子やキーワードはわかりませんがarguments.callee、同じ効果を実現する1つの方法は、クロージャ内の関数fooに名前を付けて、そのクロージャから戻るfooことです。そうすれば、プログラムによって割り当てられている変数に関係なく、常に内部の名前を使用してそれ自体を参照fooできます。foo

var fn = (function() {
  function foo() {

     if (!foo.counter) {
        foo.counter = 1;
    }
    else {
        foo.counter++
    }
    // rest of the function code goes here...
  }

  return foo;
})();
于 2012-12-27T19:08:56.777 に答える
0
function foo() {
  if (typeof foo.counter=="undefined") {
    foo.counter = 1;
  }
  else {
    foo.counter++
  }
  return foo;
}

var x = new foo();
alert(x.counter);  //1
var y = new foo();
alert(x.counter); //2
于 2012-12-27T19:16:08.010 に答える
0

関数の外でカウンターを参照する必要がない場合は、これでうまくいきます。関数自体の変数を設定する代わりに、関数の外部で変数を定義し、代わりに関数にそれを変更させます。を呼び出すたびmakeFooに、新しい変数が作成され、xを使用して関数が返されますx。返された関数を呼び出すたびに、x作成された同じものを引き続き参照しますmakeFoo. さらに、これは変数を完全にカプセル化し、返された関数の外部ではほとんど何も変更できないことを保証します (返された関数の外部のほとんどのものによって変更されることは絶対にありませんが、私が保証できないファンキーな JavaScript リフレクションが十分にあります)。何も変わらないこと)。確かに、関数を変数間で移動してもカウンター (つまり ) には影響しませんx=makeFoo();y=x;x=null;

function makeFoo() {
  var x=0;
  return function () {
    x++;
    return x;
  }
}

//different counters
x=makeFoo();
y=makeFoo();
x();//returns 1
y();//returns 1
x();//returns 2
y();//returns 2

//same counter
x=makeFoo();
y=x;
x();//returns 1
y();//returns 2
x();//returns 3
y();//returns 4
于 2012-12-28T04:54:08.137 に答える