2012-06-19 22 views
10

例として、同じ変数とパラメータを使用することが許可されていますか?どんな問題に取り組むことができますか?javascript関数で同じ変数とパラメータ名を使用できますか?

サンプルコード

function mytask(name,title){ 
      var name = name; 
      var title = title; 
      var showalert = ("Hi " + name + " your job title is " + title); 
      console.log(showalert); 
      return showalert; 
     } 

document.write(mytask("dan", "administrator")); 
+0

可能であれば、それぞれをどのように参照しますか? – cheeken

+0

あなたは関数に渡す名前付き引数を関数内の変数名として使用できますか?はい、はいできます。これで何か問題がありましたか? –

+0

コードが機能します。しかし、私はこれを維持したくありません。 –

答えて

5

まあJavaScriptではあなたは、スコープが私の中括弧に定義されていることを考えることができます:{そして}、および再定義することができスコープ変数の内部を、そう見て:

function x(){ 
    var name=3; 
    var name=4; 
    console.log(name); // output is: 4 
} 
x(); 

しかし、これはちょうど半分本当です、実際に何が起こるかは、通訳者がコードを調べて、(すべての引数が定義され、スタックから取得されている)が割り当てられている間に、すべてのvarステートメントを先頭に移動してから、書き込んだコードが実行されます。したがって、最初の後のvarは単に無視されます。あなたが書いたコードは次のようになります:

function mytask(name,title){ 
    var name = arguments[0]; 
    var title = arguments[1]; 
    name = name; 
    title = title; 
    var showalert = ("Hi " + name + " your job title is " + title); 
    console.log(showalert); 
    return showalert; 
} 

document.write(mytask("dan", "administrator")); 

したがって、あなたの再減速と割り当ては冗長です。とにかく - 範囲は変更されていませんが、それ以外は変わりません。

編集

インタプリタが何を実行すると、あなたのコードを乗り越え、どのvar x = y;文はvar x = undefined;x=y;に分割されます。 var x = undefined;はコードの先頭に移動されます。 x=y;は元の文と同じ場所にあります。スタックに関することを理解していない場合は、コンパイラが関数呼び出しをアセンブリに変換する方法については気にしないでください。時間がある場合に備えて知っておく価値があります。ここでは重要なことではありません。

とにかく - それらの変更の直後に、いくつかの最適化が行われると、結果のコードが実行されます。これはあなたが書いたコードではなく、同じコードです。引数を再定義する際に指摘したことは、この変換が目に見えるようになる場合です。

+0

あなたは、「すべてのvarステートメントを最初に移動します。定義されていない(すべての引数が定義され、スタックから取得されています)、その後、あなたが書いたコードは実行されますか? – PeanutsMonkey

+0

@PeanutsMonkey編集 –

+0

を参照してください。ちょうど私が逆流することを意味するかどうかを明確に理解してください。私が誤解しているかどうか私に教えてください。パラメータと変数が同じ宣言を共有する私の質問と同じような関数を持っているなら、 'name = name'を' name = undefined'と 'name = name'に分割すると言うことになります。そうですか? – PeanutsMonkey

1

あなたが問題に実行することができます確かに。これをみて。

function mytask(name,title){ 
      console.log(name); 
      console.log(title) 
      var name = "oops"; 
      var title = "rawr"; 
      console.log(name); 
      console.log(title) 
} 

mytask("dan", "administrator"); 

(我々はそれを再定義しているため)別に非常に混乱しているから、console.log(name);を呼び出すと、私たちに二つの異なる結果が得られます。それは許されますが、それは良い考えではありません。

編集::興味深いことに(私はこれを知らなかった)、上記のネジを暗黙のarguments[]アレイにも適用しました。たとえば、やって:

for(var i = 0; i < arguments.length; ++i) { 
    console.log(arguments[i]); 
} 

がどこかに私たちの関数内(ポスト再割り当てが)まだoopsrawr出力

。明らかに、これは悪い、悪い考えです。

1

同じ名前の変数の値がパラメータと異なる場合を除いて、値は同じであるため、パラメータと同じ名前の変数を使用できます。

1

実際、それを行う理由はありません。関数に渡すと、それらは初期化され、他の変数に再割り当てすることなく使用することができます。

2

はそれについてこのように考える:nameがすでに定義されてある場合

var name = name; 

namenameの値に設定することができる唯一の方法です。 nameに既に値がある場合は、2回行う必要はありません。

2

私はいくつかの説明が傷つくことはないと思います。 )

まず、この関数のすべての関数のパラメータは、この関数のローカルとして宣言されています。 (これはもう少し複雑ですが、この説明がそのほとんどをカバーしているとしましょう)。だから、彼らをもう一度定義することは本当に役に立たない。彼らはそれを後に「もっと地方に」なることはないだろう。 ))

var name = 123; var name = 345;と同じ理由でfunction(name)var name = nameと書くこともできます。 2番目のvarは無視されます。

そして、var name = 123; var name = name;と書くと、コードのどこかにname = name;と書くのと同じように、いくつかのキーストロークが浪費されます。 )

そして、btwは、argumentsをめちゃくちゃに説明しています。参照:nameは、実際には要素のエイリアスです。

+0

「2番目の変数は単に黙って無視されます」と「引数」を説明するのはどういう意味ですか? – PeanutsMonkey

+0

どのように巻上げがより詳細に機能するか説明したいですか? – raina77ow

+0

@ raina77owこれは 'strict'モードで動作しますか? – Medorator

関連する問題