5
function validateHistoryId(input) {
    $.getJSON('request.php', {"action": "historyExists", "history_id" : input.value},
              function(data) {
                  console.log(input.value);
              }
    );
}

javascript関数からjQueryajax呼び出しを使用します。上記のコードを試してみましたが、動作しますが、今後問題が発生するかどうかはわかりません。

知りたいのですが、ajaxコールバック関数はその親関数の変数を見ることができますか?そうするのは悪い習慣ですか?

4

1 に答える 1

10

これは、JavaScriptで機能する方法です。これはクロージャと呼ばれます。関数は、現在のスコープおよび他の親スコープから変数ポインターを運びます。したがって、これは良い習慣であるだけでなく、パラメータオブジェクトなどをプッシュするのではなく、通常従う必要のあるパターンです。

「this」参照は特別であり、(他の参照とは対照的に)閉じられることはなく、したがって常に無名関数でグローバルオブジェクトを指すことに注意してください。

実際、開発者はクロージャー機能の力を完全に活用するためにある程度の時間を必要とします-これはあなたが今書いた基本的な例です。より高度な(非同期だけでなく)シナリオでは、クロージャーは「ファイアアンドフォーゲット」動作を作成するのに役立ちます。または、クライアントコードからアクセスできない「プライベート」変数を提供できます(ライブラリ開発に役立ちます)。クロージャは、グローバルスコープを混乱させないようにコードを分離するのにも役立ちます。

1)例:クロージャを使用して保護された変数を作成する方法。「protectedVariable」にアクセスできる2つのメソッドにアクセスできますが、自分でアクセスすることはできません。そのため、制御が保証されます。

function protectedScope(initData) {
  var protectedVariable = initData;

  return {
    getter: function()  { return protectedVariable; }
    setter: function(v) { protectedVariable = v; }
  }
}

var methods = protectedScope(10);

console.log(methods.getter());

2)分離:次のコードは、「グローバル」関数定義を使用してもグローバルスコープをガベージしません

var API = (function() {
   var protectedVariable = 0;

   var myNotGlobalFunction() {
      return protectedVariable;
   }

   return myNotGlobalFunction;
})();
于 2012-10-19T06:04:56.020 に答える