0
<script type="text/javascript"> 
var output = function() {console.log('result')}
output();
</script>  

変更しoutput = function() {console.log('result')};ても正しい結果が表示されるので、私の質問は次のとおりです。

それらの違いは何ですか?jsの関数の前にいつvarを置くべきですか? varそれは変数の前と同じ原則ですか?

4

6 に答える 6

3

タグで定義された関数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ローカルで定義されていないため、グローバル オブジェクトを上書きしました。

于 2013-07-04T07:57:17.950 に答える
1

あなたはグローバルwindowスコープにいるので、違いはありません。

変数の型は何でもかまいません。

これが関数で宣言されている場合、違いがあります。

function name(){
    var a=1;
}
alert(a);

関数のスコープで変数を宣言するため、ここでaは未定義になります。var

演習として:

var a=2;
function name(){
    var a=1;
}
name();
alert(a);

中央は関数のスコープに属し、グローバル スコープとは別であるため、これは の2代わりにアラートを出します。1var

次の方法でグローバル変数を変更することもできます。

var a=2;
function name(){
    a=3;
}
name();
alert(a);

letまた、これを代わりにブロックに範囲を制限すると比較してください: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

于 2013-07-04T07:51:44.170 に答える
0

機能するかどうかに関係なく、MDN は var について次のように述べています

var で宣言された変数のスコープは、囲んでいる関数、または関数の外で宣言された変数の場合、グローバル スコープ (グローバル オブジェクトにバインドされている) です。

関数外での var の使用はオプションです。宣言されていない変数に値を代入すると、暗黙的にグローバル変数として宣言されます (グローバル オブジェクトのプロパティになりました)。違いは、宣言された変数はグローバル オブジェクトの構成不可能なプロパティであり、宣言されていない変数は構成可能であることです。

関数ステートメントについてはこちら、関数演算子についてはこちらをご覧ください。

乾杯!

于 2013-07-04T08:23:09.080 に答える
0

「変数の前の 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'
于 2013-07-04T07:55:46.003 に答える
0

変数がないvarと、グローバル変数として宣言されます。つまり、他のJSファイルでも使用できます。つまり、 を使用せずに変数を宣言するvarと、変数は常に GLOBAL になります。

于 2013-07-04T07:56:45.683 に答える
0

あなたは global にいるので、通常は違いはありませんscopeが、ES5strict modeは、宣言されていない変数の動作をわずかに変更する があります。ではstrict mode、宣言されていない識別子 (前に置かない) への代入varは ReferenceError です。

例えば:

"use strict";
myVariable = "foo"; // throws a ReferenceError
于 2013-07-04T07:57:46.210 に答える