2014-03-07 12 views
0

클로저 된 함수는 개체의 값을 보호하지 않지만 알몸 함수는 유지합니까? I have the below code on jsFiddle.클로저 된 함수가 개체의 값을 보호하지 않지만 알몸 함수는 유지되는 이유는 무엇입니까?

나는 Object 기본값 인 Lo-Dash _.assign 기능을 사용하고 있습니다. 그래서 같은 결과

var cnst = _.constant({test: 'It Works!'}) 
var newCnst = _.assign(cnst(), {test: "It doesn't work!"}) 
console.log(cnst()) 
console.log(newCnst) 

:

{test: "It doesn't work!"} 
{test: "It doesn't work!"} 

그래서 난 그냥 알몸 일정 기능과 같이 수행

{test: 'It Works!'} 
{test: "It doesn't work!"} 

: 결과

var test = function(){return {test: 'It Works!'}} 
var newTest = _.assign(test(), {test: "It doesn't work!"}) 
console.log(test()) 
console.log(newTest) 

그냥 그렇게해야합니다. 닫힌 상수 값이 보호되지 않는 이유는 무엇입니까? 내가 나 자신을 할 경우에도 : 결과

var constant = function(value){return function(){return value}} 
var t = constant({test: 'Closured Works!'}) 
var t2 = _.assign(t(), {test: "No closured doesn't work!"}) 
console.log(t()) 
console.log(t2) 

:

{test: "No closured doesn't work!"} 
{test: "No closured doesn't work!"} 

답변

1

이유는 모두 소호 - 대시 예에서는 사용자 정의 constant 구현, 항상 생성 함수에 대한 참조를 반환한다는 것입니다 동일 인스턴스.

var test = function(){return {test: 'It Works!'}} 

:이 예에서는

console.log(newCnst === cnst()) // true 
console.log(t2 === t())   // true 

그러나 :

var cnst = _.constant({test: 'It Works!'}) 

var constant = function(value){return function(){return value}} 
var t = constant({test: 'Closured Works!'}) 

이것은 선택하여 확인할 수 있습니다 : 그것은 단지 하나의 목적은 지금까지 생성이 두 조각으로 말을하는 것입니다 함수가 호출 될 때마다 새 객체가 만들어집니다. 그래서 전화 할 때 :

console.log(newTest === test()) // false 
을 :

var newTest = _.assign(test() /* new object created here */, {test: "It doesn't work!"}) 
console.log(test() /* new object created here */) 
console.log(newTest) 

이를 확인하여 확인할 수 있습니다