2009-11-06 9 views
84

javascriptで別名/参照をローカル変数に割り当てることはできますか?javascript変数リファレンス/エイリアス

私はCのような何かを意味:

function foo() { 
    var x = 1; 
    var y = &x; 
    y++; 
    alert(x); // prints 2 
} 

= EDIT =

は、このコード?:JavaScriptで

function foo() { 
    arguments.callee.myStaticVar = arguments.callee.myStaticVar || 0; 
    arguments.callee.myStaticVar++; 
    return arguments.callee.myStaticVar; 
} 
+4

単純な回答ではありません。しかし、私は誰かがこれを行うハックに来るだろうという気持ちを持っています:) – Amarghosh

答えて

161

、プリミティブ型でエイリアスarguments.calleeをすることが可能です整数や文字列などの値は渡され、オブジェクトは参照渡しされます。私の前の回答に

// declare an object with property x 
var obj = { x: 1 }; 
var aliasToObj = obj; 
aliasToObj.x ++; 
alert(obj.x); // displays 2 
+0

は速かった=)私は自分の関数内でarguments.calleeへのエイリアスを作成したい(毎回arguments.calleeをタイプしないようにする) 。この方法でこの可能性はありますか?私が理解すれば、私は "引数"の別名を付けることができますが、とにかく "呼び出し先"を書く必要がありますか? – gpilotino

+0

あなたのコードを投稿できますか? –

+0

が投稿されました。私の質問はあまりにも一般的なので、私はこの答えを受け入れる。 – gpilotino

1

編集:だから、あなたがオブジェクトを使用する必要があり、これを達成するために、あなたは、関数の呼び出しをカウントしたい場合は、あなたがしようとする場合があります:

ここ
var countMe = (function() { 
    var c = 0; 

    return function() { 
    c++; 
    return c; 
    } 
})(); 

alert(countMe()); // Alerts "1" 
alert(countMe()); // Alerts "2" 

、 cはカウンタとして機能し、arguments.calleeを使う必要はありません。

+0

または静的変数 'countMe = function f(){ return ++ f.c ||を使用できます。 (f.c = 1)。 } ' – aljgom

12

はこれが可能であるある程度まで、あなたはクロージャを使用して変数にエイリアスを作成することができます:あなたが何かを別名設定できるかどうか

​​
+1

私は "警告(y)を; //プリント2" と信じて は次のようになります。 "警告(Y()); //プリント2" あなたが実際に関数を呼び出す必要があります結果を得る。提案された構文が特定の状況で役立つので、あまりにも悪い。 –

+2

toStringの再定義は理由があるため、 'alert(y)'は実際には正しいです。 Functionプロトタイプメソッドを再定義することは非常に悪い方法ですが。しかし、ねえ、それは動作します! – metalim

7

は、データ型によって異なります。オブジェクト、配列、関数は参照によって処理され、エイリアスが可能です。他の型は本質的に原子的であり、変数は値への参照ではなく値を格納します。

arguments.calleeは関数なので、それを参照してその共有オブジェクトを変更することができます。上記のコードでは、あなたがself = function() {return 42;};を言っていたならば、selfが、その後fooへの参照残る、arguments.calleeより異なるオブジェクトを参照するだろうと

function foo() { 
    var self = arguments.callee; 
    self.myStaticVar = self.myStaticVar || 0; 
    self.myStaticVar++; 
    return self.myStaticVar; 
} 

注意。複合オブジェクトがある場合、代入演算子は参照を置き換えますが、参照されるオブジェクトは変更しません。原子値の場合、y++のような場合はy = y + 1に相当し、これは変数に '新しい'整数を割り当てます。

+0

ありがとう、それは私が知る必要があったものです。 – gpilotino

+0

'arguments.callee'にはすでに関数の名前であるエイリアスがあります。この例では 'foo.myStaticVar'を使うことができます(これは2009年には当てはまらないかもしれません) – aljgom

0

私は私のプロジェクトのために、今日検索して行うための最善の方法になりそうだどの本を見つけました:http://sirdarckcat.blogspot.com/2007/07/passing-reference-to-javascript.html

+4

あなたの答えは本質的にリンクであるため、あなたの投稿を改善することを検討してください。参照:[他の場所のリンクに本当に「良い回答」が含まれている回答はありますか?](http://meta.stackexchange.com/q/8231/156620)と[リンクが悪い理由は何ですか](http://meta.stackexchange .com/q/7515/156620) –

1

user187291's postを拡張し、あなたも関数を使用する必要が周りを取得するためにゲッター/セッターを使用することができます。

var x = 1; 
var ref = { 
    get x() { return x; }, 
    set x(v) { x = v; } 
}; 
(ref.x)++; 
console.log(x); // prints '2' 
x--; 
console.log(ref.x); // prints '1'