1

私はCとJavaに慣れているので、Javascriptのブロックスコープの欠如は少し厄介だと感じました。この問題を解決するために、宣言してすぐにインライン関数を実行したいと思うことがあります。例えば:

... 

if (x == 0) { 
  (function () {
    var i;

    for (i = 0; i < 10; i++) {
      ...
    }
  })();
}

...

そうでなければ、ブロックスコープの欠如を忘れないようにするために、スコープの上部にある関数のすべての変数を宣言する必要があると感じます。しかし、関数の先頭に巨大なvarステートメントがあると、私には不器用に見えます。

上に示した方法は無駄に感じますが、そもそもインライン関数を宣言するのに何がかかるのかわかりません。このようにするのは悪い考えですか?Javascriptのスコープで私の問題を解決するためのより良い方法はありますか?

4

2 に答える 2

3

ES5機能を除くJavaScriptスコープは、関数レベルです。これは、Cが何よりも先に変数を宣言することを要求していた方法と似ています。あなたはそれと一緒に暮らす必要があります。

コードが構文的に正しくありません。functionキーワードで始まるステートメントがありますが、関数名はありません。その後に。が続き()ます。私はあなたが関数宣言ステートメントについて話していると仮定しました。式の一部として関数をインスタンス化するだけの場合、スコープは、少なくとも関数の外部では、実際にはそれを理解しません。

于 2013-03-10T04:05:52.220 に答える
3

次のように書くことの何が問題になっていますか。

if (x === 0) { // you should always use === over == in JavaScript
    for (var i = 0; i < 10; i++) {
        // body
    }
}

JavaScriptがブロックスコープをサポートしていないからといって、ブロックスコープで変数を宣言できないわけではありません。

変数はどこでも宣言できます。ただし、関数のスコープ内のどこにでも表示されます。

JavaScriptにブロックスコープがないために発生する唯一の問題は、自由変数にアクセスするループ内で関数を定義する場合です(悪名高いループの問題)。

次のStackOverflowスレッドを読んで、頭を包み込みます。ループ内のJavaScriptクロージャ–簡単な実用例

JavaScriptはシンプルです。CやJavaよりもはるかに単純です。Javaよりもはるかに賢明です。Javaは哀れな言語です。

JavaScriptコミュニティを短剣にしたいのなら、あなたは素晴らしい仕事をしています。それ以外の場合は、JavaScriptを採用してください。ダグラス・クロックフォードの言葉で:

私自身の練習では、JavaScriptを使用することで、便利な一連の動的な手法が紹介されたため、より優れたJavaプログラマーになることがわかりました。

出典:JavaScriptプログラミング言語の調査

于 2013-03-10T14:17:29.717 に答える