<script type="text/javascript">
var output = function() {console.log('result')}
output();
</script>
変更しoutput = function() {console.log('result')};
ても正しい結果が表示されるので、私の質問は次のとおりです。
それらの違いは何ですか?jsの関数の前にいつvarを置くべきですか? var
それは変数の前と同じ原則ですか?
<script type="text/javascript">
var output = function() {console.log('result')}
output();
</script>
変更しoutput = function() {console.log('result')};
ても正しい結果が表示されるので、私の質問は次のとおりです。
それらの違いは何ですか?jsの関数の前にいつvarを置くべきですか? var
それは変数の前と同じ原則ですか?
タグで定義された関数script
はグローバル スコープ (つまり、window
ブラウザ コンテキスト内のオブジェクト) にあるため、この場合は違いはありません。
ただし、関数ブロック内では話は別です。例えば:
foo = function() {
var foo = 1;
console.log(foo);
}
foo(); // logs '1'
foo(); // logs '1'
しかし:
foo = function() {
foo = 1;
console.log(foo);
}
foo(); // logs '1'
foo(); // SyntaxError: Unexpected token function
foo
ローカルで定義されていないため、グローバル オブジェクトを上書きしました。
あなたはグローバルwindow
スコープにいるので、違いはありません。
変数の型は何でもかまいません。
これが関数で宣言されている場合、違いがあります。
function name(){
var a=1;
}
alert(a);
関数のスコープで変数を宣言するため、ここでa
は未定義になります。var
演習として:
var a=2;
function name(){
var a=1;
}
name();
alert(a);
中央は関数のスコープに属し、グローバル スコープとは別であるため、これは の2
代わりにアラートを出します。1
var
次の方法でグローバル変数を変更することもできます。
var a=2;
function name(){
a=3;
}
name();
alert(a);
let
また、これを代わりにブロックに範囲を制限すると比較してください: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
機能するかどうかに関係なく、MDN は var について次のように述べています。
var で宣言された変数のスコープは、囲んでいる関数、または関数の外で宣言された変数の場合、グローバル スコープ (グローバル オブジェクトにバインドされている) です。
関数外での var の使用はオプションです。宣言されていない変数に値を代入すると、暗黙的にグローバル変数として宣言されます (グローバル オブジェクトのプロパティになりました)。違いは、宣言された変数はグローバル オブジェクトの構成不可能なプロパティであり、宣言されていない変数は構成可能であることです。
関数ステートメントについてはこちら、関数演算子についてはこちらをご覧ください。
乾杯!
「変数の前の var と同じ原理ですか?」
はい。出力は変数です。
したがって、定義するvar
ときにその前に使用することをお勧めします。最終的には、var を使用せずにその値を変更できます。次のように:
var A=1;
A=2;
A=A+1;
関数の「スクリプト」をその変数の「値」と考えてください。
var F=function() {console.log('one')};
// change it later
F=function() {console.log('two')};
(これを勧めているわけではありませんが、100% a var であることを示すために)
実際には、「output」という名前の変数に、「function() {console.log('result')}」の値を文字列としてではなく、実行されるスクリプトとして割り当てています。のように末尾のセミコロンに注意してくださいvar A=3;
「内部」output
には、実行するコードがありますconsole.log('result')
。(多かれ少なかれ、説明するだけです)。
通常、同じ関数を後で変更することはありません (変更できる場合もあれば、変更される場合もあります)。厳密に必要ではない場合でも、このような関数を定義するたびvar
に、前に使用することをお勧めします。既存の関数をオーバーライドしないように注意してください。
これは、関数を次のように定義するのとは少し異なります。
function output() {console.log('result')}
ここでは、= 記号、代入、最後にセミコロンはありません。これは変数の割り当てではなく、関数の「定義」ですが、結果は似ており、両方の場合で output() を呼び出すことができますが、違いがあります。私が思う主な問題は、スクリプトを行ごとに実行する前に関数定義を調べることですが、代入では、関数を使用する前に実際に代入行を処理する必要があります。したがって、この:
output();
function output() {console.log('result')}
動作します。これの間:
output(); // nope! output not defined yet!
var output=function() {console.log('result')}
しません。変数は、代入命令が読み取られて解釈されるときに代入または変更されます。
// here A is undefined, B() prints 'ok'
var A=function() {console.log('first')};
// here A() prints 'first', B() prints 'ok' as usual
A=function() {console.log('second')}; // change it
// here A() prints 'second', B() prints 'ok' as usual
function B() {console.log('ok')}
// same here A() prints 'second', B() prints 'ok'
変数がないvar
と、グローバル変数として宣言されます。つまり、他のJS
ファイルでも使用できます。つまり、 を使用せずに変数を宣言するvar
と、変数は常に GLOBAL になります。
あなたは global にいるので、通常は違いはありませんscope
が、ES5にstrict mode
は、宣言されていない変数の動作をわずかに変更する があります。ではstrict mode
、宣言されていない識別子 (前に置かない) への代入var
は ReferenceError です。
例えば:
"use strict";
myVariable = "foo"; // throws a ReferenceError