1

私はプライバシーのためにクロージャーを使用しています。クロージャの外側からローカル変数を変更する理由と方法がわかりません。

問題を説明するためのスクリプトを作成しました。

var MyAjax=(function(){
  //Create a local variable for privacy
  var _opts={ 
       cache:true
   }
  ,getDefaultOptions=function(){
      return _opts
  };

  //return only getDefaultOptions function
  return { 
     getDefaultOptions:getDefaultOptions
  }
})()


//I am merging new ajax options with default options.
var defaults=MyAjax.getDefaultOptions();
var reqOptions= $.extend(defaults,{cache:false});

// I am getting expected result
console.log("extended var",reqOptions) //{cache:false}

// I am getting non expected result
// I should get {cache:true} but I am getting { cache:false }
console.log("defaults",MyAjax.getDefaultOptions()) //{cache:false} 

なぜこれが起こるのか、そしてどのように?

4

1 に答える 1

1

$.extend()関数は最初の引数を変更します。それを望まない場合は、次のようにします。

var reqOptions = $.extend({}, defaults, {cache: false});

詳しく説明すると、オブジェクトへの参照を最初の引数として渡します。そのクロージャーのプライベート変数ですが、ゲッター関数はそれへの参照を返しているため、そのように「表示」されています。jQuery 関数は、最初の引数として渡されたオブジェクトを常に直接更新するように記述されています。したがって、そのオブジェクトを変更しないようにするには、新しく作成したオブジェクトを最初の引数として渡します。

于 2012-07-25T12:29:55.070 に答える