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});

详细说明:您将对象的引用作为第一个参数传递。即使它是该闭包的私有变量,getter 函数也返回了对它的引用,因此它是“可见的”。jQuery 函数的编写方式总是直接更新作为第一个参数传递的对象。因此,为确保您不会更改该对象,只需传入一个新创建的对象作为第一个参数。

于 2012-07-25T12:29:55.070 回答