12

Stoyan Stefanov は JavasScript Patterns で次のように述べています。

これが彼の例です

(function() {
    var days = ['Sun','Mon'];
    // ...
    // ...
    alert(msg);
}());

しかし、確かに days は var として定義されているため、それは単なる機能スコープになるのでしょうか? 即時関数の唯一の利点は、関数がすぐに呼び出されることです。範囲の利点はありません。正しい?

4

8 に答える 8

16

すぐに実行される関数と通常の関数についてではありません。実際、それはほとんど関係がありません。

すぐに呼び出されるラッピング関数の唯一の目的は、ラッピング関数にローカルな変数のスコープを設定することです。

(function() {
    // This variable is only available within this function's scope
    var thisIsTemp = "a";

    // ...
}());

console.log(thisIsTemp); // undefined        

対:

// This variable is available globally
var thisIsTemp = "a";

// ...

console.log(thisIsTemp); // "a"
于 2012-11-13T16:15:53.327 に答える
6

技術的には正しいです (関数は即時であるため、スコープの利点はありません。単純な退屈な関数でも同様です)。ただし、忘れないでください。

  1. 今すぐ実行したいコードがあります
  2. そのコードが名前を現在のスコープに漏らしたくない

したがって、関数は #2 のために作成されますが #1 のためにすぐに呼び出されます。

于 2012-11-13T16:15:19.163 に答える
6

変数をdays関数スコープに入れることは、まさにこの例が示しているポイントです。すぐに呼び出される関数がないと、すべての変数 ( daysmsg) がグローバル変数になり、グローバル名前空間が汚染されます。

于 2012-11-13T16:14:36.237 に答える
0

var関数内にあるという背後にある考え方は

グローバルスコープに変数をリークしない

問題は、この場合、日は関数の外では見えず、コンソールに書き込もうとするconsole.log(days)と、日が定義されていないということです

これは、他の誰があなたのコードを後で使用するか分からず、変数日を再定義する可能性があるためです。

于 2012-11-13T16:16:27.200 に答える
0

daysはまだ関数のローカル スコープにあります。ここで行っているのは、ローカル スコープ内でタスクを実行しているため、そのスコープ内で定義したものがグローバル名前空間を汚染することはありません。それ以外の場合は、グローバル スコープで次のようになります。

var days = ['Sun','Mon'];
// ...
// ...
alert(msg);
于 2012-11-13T16:16:58.697 に答える
0

JavaScript では、ローカル変数にはブロック スコープではなく関数スコープがあります。たとえば、投稿したコードでdaysは、実際には関数に対してローカルです。

(function() {
  var days = ['Sun','Mon'];
  // ...
  // ...
  alert(msg);
}());

しかし、グローバルスコープで次のように言うと:

// ...
{ 
    var days = ['Sun','Mon'];
    // ...
    // ...
}
alert(msg);

daysブロック内で定義されていても、グローバル変数(外側のスコープのすべてから見える)になります。それは理にかなっていますか?

于 2012-11-13T16:17:23.860 に答える