2

数日前、私は自分の例でグローバル変数と関数がいかに悪いかを学びました。したがって、明らかに最善の解決策はそれらを使用しないことですが、遅かれ早かれ、変数と関数を何度も再利用する必要があります。

だから私の質問は:グローバルに宣言せずに関数と変数を再利用できますか?できますか?

たとえば、alertBox関数とcontainsP変数を数回再利用したいとします。

デモ:http://jsfiddle.net/ajmyZ/

//I am BAD GLOBAL FUNCTION inside var 
//But I am reusable!!! 

var alertBox = function () {
    alert("Hey I am BAD function!!")
}





$(document).ready(function () {
    //I am BAD GLOBAL var 
    //But I am reusable TOO!!! 
    var containsP = $("div p:first");
    containsP.click(function () {
        alert("Hi BAD var HERE!!");
    });

    $("p").eq(1).click(function () {
        alertBox();
    });

    //I am the NICEST function here
    //but I am NOT reusable :(

    $("p").eq(2).click(function () {
        alert("I am the NICEST function here!!");

    });

});
4

2 に答える 2

4

グローバルオブジェクトの破壊を回避する最も簡単な方法は、独自の「アプリケーションコンテキスト」を作成することだと思います。これを行うには、jsコード全体を各ファイル内にラップする自己呼び出し関数を作成します。

(function( win ) {
    "use strict";

    var still_global_but_only_in_this_anonymous_closure = true;

    $(document).ready(function() {
         // ...
         // accessing the global object:
         win.some_global_property = true;
    });
}( this ));

実際には、渡した無名関数を使用して、このようなローカルコンテキストをすでに作成しています.ready()。これは、より明確な方法です。その自己呼び出しメソッドは、引数としてグローバルオブジェクトを使用して自分自身を呼び出すだけです(グローバル変数に明示的にアクセスできます)。さらに、呼び出す"use strict";ことで、誤ってグローバル変数を作成することから保護されます。"Ops_I_Forgot_The_Var_Statment = true;

于 2012-07-31T14:10:58.260 に答える
1

投稿したコードにはグローバル変数がありません。関数内で宣言された変数(この例の場合、匿名document.readyハンドラー)は、次の2つの間違いのいずれかを行わない限り、グローバルになることはありません。

  1. varキーワードを忘れて、暗黙のグローバルを作成します
  2. 明示的に言うwindow.myVar = ...;
于 2012-07-31T14:12:28.820 に答える