4

コード変数名が互いに競合するという問題があります。

<script type="text/javascript">var a = "hello"; </script>
<script type="text/javascript">alert(a);//this works, when I want 'a' not to exist </script>

クロージャは唯一の選択肢ですか?

ac#のバックグラウンドから来て、デリゲートの参照されていないインスタンスを構築し、それをインラインで呼び出すようなものですが、これは少し厄介なようです

(function(){var a = "hello";})();
(function(){alert(a);})();//yes! working as expected
4

5 に答える 5

6

(すぐに自己実行する)関数を使用して新しいスコープを作成することは、確かに進むべき道です。

これには、特定の変数が特定の値を持つようにすることができるという利点もあります。jQueryを使用する場合、たとえば次のことが一般的です。

(function($, window, undefined) {
    // ...
})(jQuery, this);

(例のように)それぞれに1つのステートメントしかない関数がたくさんない限り、それも完全に読み取り可能です。

于 2012-06-12T14:47:05.077 に答える
5

はい、閉鎖はあなたの唯一の選択肢です。ブラウザでは、すべてのJavaScriptファイルが同じグローバルスコープに配置されます。

IIFEはJavaScriptで非常に一般的な場所です。私はそれらを乱雑とは呼びません。

于 2012-06-12T14:46:46.387 に答える
2

JavaScriptは、ブロック スコープを持つ C# とは異なり、関数スコープのみを持ちます。次のコードは有効な JavaScript および C# です。

var x = 2;
while(true) {
    var y = 3;
    break;
}
//y is not accessible here in C#, but is in javascript

新しいスコープを作成する唯一の方法は、匿名関数を作成して実行することです。

于 2012-06-12T14:52:02.830 に答える
0

別の視点を提供するためだけに。クロージャを使用せずにコードを記述し、(おそらく)安全なグローバル変数スコープを維持することが可能です。

  1. 名前空間として使用する単一のオブジェクトを、グローバルスコープを持つ適切に一意の名前(MyAppContextなど)で定義します。アプリケーションでのみ使用するためにグローバルのような変数を定義する必要がある場合は、それらをこのオブジェクトにアタッチします。

    MyAppContext.appTitle='アプリケーションタイトル';

  2. 作成するスクリプトの開始時に、スクリプトがMyAppContect存在しないことを確認してください。

  3. すべての関数スコープ変数がvarキーワードを使用していることを確認して、グローバル値を参照していないことを確認してください。

明らかに、このアプローチでは、関数変数の一部をで定義するのを忘れるリスクがありますvarJSLintは、これに対応するのに役立ちます。

炎上し始めたらこの答えを撤回できてうれしいですが、クロージャーを使用するための実行可能な代替アプローチだと思います。そしてねえ!それは古いスクールです

また、クロージャの使用がより安全であることに同意しますが、これはあなたの興味を引くかもしれないと思いました。

于 2012-06-12T15:12:38.560 に答える
0

要するに、インラインのものについては、モジュールパターンを使用してクロージャーを作成し、プライベート変数をエミュレートするのが最善です。

(function(){
    var a....
    })();

より良い長期的なアプローチは、オブジェクトを名前空間として使用することです。

var NS = {};
NS.a = 1;
于 2012-06-12T14:51:34.497 に答える