2012-07-25 1 views
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} 

왜 이런 일이 발생하고 어떻게됩니까?

+0

$ .extend가'defaults.cache'를 false로 덮어 쓰고 있습니다. 이것이 확장 기능입니다. – jbabey

+0

defaults 변수의 변경 normal.But MyAjax.getDefaultOptions()를 다시 호출하지만 캐시를 false로 반환합니다. –

+1

"자바 스크립트는 항상 값으로 전달되지만, 변수가 객체를 참조하면 (배열 포함)"값 "은 객체에 대한 참조입니다." http://stackoverflow.com/questions/6605640/javascript-by-reference-vs-by-value – jbabey

답변

1

$.extend() 함수는 첫 번째 인수를 수정합니다. 이를 원하지 않으면 다음을 수행하십시오.

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

정교하게 : 첫 번째 인수로 객체에 대한 참조를 전달합니다. 클로저의 private 변수 일지라도 getter 함수는 이에 대한 참조를 반환 했으므로 "get"함수는 그 방식으로 "볼 수 있습니다". jQuery 함수는 항상 첫 번째 인수로 전달 된 객체를 직접 업데이트하는 방식으로 작성됩니다. 따라서 해당 객체를 변경하지 않으려면 새로 생성 된 객체를 첫 번째 인수로 전달하십시오.

+0

클로저는 getDefaultOptions 함수 만 포함하는 json 객체 만 반환합니다. _opts에 액세스하여 변경하려면 어떻게해야합니까? 클로저의 포함 된 변수를 참조 하시겠습니까? –

+0

"getDefaultOptions"함수는 "_opts"개체에 대한 참조를 반환합니다. 객체에 대한 참조를 반환하면 외부 코드에서 객체를 수정할 수 있습니다. 그것이 객체 참조가 작동하는 방법입니다. 외부 코드는 private이기 때문에 함수를 호출하는 것 이외의 방법으로 "_opts"에 액세스 할 수 없지만 일단 참조가 노출되면 다른 코드가 다른 객체와 마찬가지로 객체를 조작 할 수 있습니다. – Pointy

+0

Ok. 기본값 변수가 _opts를 참조하면 왜 'var1 = true'로 동일한 결과를 얻지 못합니까? var2 = var1; var2 = false; console.log (var2)'? 착취는 무엇입니까? 그것은 동일하지 않습니다'var1 = true; and var1 = getTrue();'이것은 PHP에서 use & character와 동일합니까? –

관련 문제