21

javascriptのvarキーワードにより、変数がローカルスコープに格納されます。変数がないvar場合は、グローバルスコープに属します。関数はどうですか?関数が変数のように宣言されたときに何が起こるかは明らかです

var foo = function() {...}

しかし、スコープは何をしますか

function foo() {...} 

所属する?

編集:フォローアップとして、私は完全に正しい質問をしなかったことに気づきました。最も外側のネストでは、上記の2つの宣言と次の宣言の間に違いがありますか?

foo = function() {...}
4

4 に答える 4

27

常に現在のスコープに属します。例えば:

// global scope

// foo is a global function
function foo() {

    // bar is local to foo
    function bar() {

    }

}

2番目の質問に関して、これは次のとおりです。

foo = function() {...}

グローバル変数に割り当てられた無名関数式です(実行しているのが厳密モードでない限り、foo未定義になります)。それとの違いfunction foo() {}は、後者が関数宣言であるということです(匿名関数式が割り当てられる変数宣言とは異なります)。

関数宣言と関数式に関するこの優れた記事に興味があるかもしれません:名前付き関数式の謎を解き明かします。

于 2013-02-02T18:41:18.537 に答える
11

関数宣言は、varキーワードで宣言された変数のように、常に現在のスコープに対してローカルです。

ただし、違いは、(変数に割り当てられるのではなく)宣言されている場合、それらの定義が引き上げられるため、宣言がコードの最後にある場合でも、スコープ内のどこでも使用できることです。var functionName = function(){} vs function functionName(){}も参照してください。

于 2013-02-02T18:49:07.210 に答える
5

暗黙のグローバルを考慮した注目すべき違い:

var foo = function() {
  // Variables
  var myVar1 = 42;  // Local variable
      myVar2 = 69;  // Implicit global (no 'var')

  // Functional Expressions
  var myFn1 = function() { ... }  // Local 
      myFn2 = function() { ... }  // Implicit global

  function sayHi() {
    // I am a function declaration. Always local.
  }
}

うまくいけば、それは少し明確になります。var割り当ての前にaを忘れた場合、暗黙のグローバルが定義されます。変数宣言と関数式に適用される危険な危険です。

于 2013-12-16T23:43:52.737 に答える
0

最初の例(var foo = function() {...})は無名関数と呼ばれます。実行時に動的に宣言され、通常の関数と同じ規則には従いませんが、変数の規則に従います。

于 2013-02-02T18:45:37.947 に答える