2011-11-29 10 views
9

これはばかげた質問かもしれませんが、JavaScriptの関数引数の前にvarキーワードがないのはなぜですか?JavaScriptの引数の前にvarキーワードがないのはなぜですか?

理由:

function fooAnything(anything) { 
    return 'foo' + anyThing; 
} 

そしてません:私は答えを感じている

function fooAnything(var anything) { 
    return 'foo' + anyThing; 
} 

because that's what the Spec saysですが、まだ...

+0

なぜこのキーワードが必要ですか? 'var'は変数を宣言し、パラメータは少し異なります。そこにキーワードのポイントはありません、それは価値を追加します。 –

+0

それは十分な理由ではありませんか?どのような追加情報があなたに与えるのでしょうか?また、関数名を宣言するたびに4文字を節約できます。これを明示的にするために変数名を長くすることができます:)。 – Asken

+1

ECMA-262では、宣言された変数のような仮パラメータは、コードが実行される前にローカル変数オブジェクトの名前付きプロパティになります。したがって、仮パラメータは、デフォルトでは多かれ少なかれ宣言されます。 – RobG

答えて

6

それはvarキーワードの冗長使用であろう。関数名宣言に続くカッコ内の項目は、その関数の明示的なパラメータです。

+0

私はそれらが関数のための_explicitly_パラメータだと言います。 – nnnnnn

+0

@nnnnnn良い点、私は私の答えを更新しました –

2

varキーワードは、変数の有効範囲を宣言します。関数の引数は、その引数のスコープも導入します。そのため、同じ機能を果たすので、必要はありません。

7

ほとんど動力学型プログラミング言語は引数リストに明示的な変数を持たない。 varキーワードの目的は、(ほんの数言語は、Pythonのように、完全にVARと離れて行く「私は、既存の変数を設定しています」と

var x = 17; //new variable 
x = 18; //old variable 

のように「私は新しい変数を作成しています」を区別することですしかし、その前のあいまいさを解決する必要はありませんがvarはまだ広まっているように、いくつかの問題が

)は、例えば、閉鎖や不慮のタイプミスとされているが、引数リストであなたが既存の変数にを割り当てることはできません。したがって、引数リスト内のvar宣言は、それ以上の冗長な定型文ではありません。 (冗長定型が悪いです - exibit AでCOBOLを参照)


あなたは、おそらくCやJavaからアイデアを得ているが、その場合には型宣言は変数宣言と倍増し、引数リストで嫌なものは、のためであります型はではなく、宣言用にはです。

一部の型付き言語でも、「型がなく、可変ではない」引数リストも使用できます。たとえば、Haskellでは、型を推論することができるので、それらを引数リストに書き留める必要はありません。この引数リストは、ちょうど変数名で構成さとJavascriptの場合のように、我々は余分を配置する必要はありませんので、そこに(「VAR」とHaskellのと等価)「せ」:

f a b = --arguments are still variables, 
     -- but we don't need "let" or type definitions 
    let n = a + b in --extra variables still need to be declared with "let" 
    n + 17 
+1

これは素晴らしい答えです、なぜそれはどんな愛を得ていない:( – Esailija

+0

"しかし、引数リストでは、変数を割り当てることはできません" - いくつかの言語は、引数リスト(パラメータが呼び出し元によって提供されない場合に適用されます)が、JavaScriptが引数リストの先頭に 'var'を必要としない場合でも適用されます。 – nnnnnn

1

私は思います我々はfunction bla (int i)を見るのに慣れていたので質問が出ますin many languages。変数を宣言するには、関数本体のどこかの部分で同じ、構文的にはint i;です。しかし、2つのintは同じことをしていません。最初はタイプを定義し、2番目はタイプとスコープを定義します。型を宣言する必要がない場合は、スコープ宣言を実行する必要があります(2番目のケースではvarになっています)が、引数の前に情報は必要ありません。

関連する問題