2013-07-06 4 views
0

자바 스크립트 저장소가 내부적으로 어떻게 작동하는지에 대한 질문이 있습니다.자바 스크립트 함수 복사본

내가 두 번 makesomething의 함수를 호출하기 때문에
var makesomething = function (x) { 
    var thing = { 
     x: x 
    }; 

    thing.do = function() { 
     this.x++; 
    }; 

    return thing; 
}; 

var x1 = makesomething(1); 
var x2 = makesomething(2); 

는, 즉 "할"기능의 두 사본이 본질적 있다는 것을 의미 또는 객체가 같은 기능에 대한 참조를 가지고 있지만 다른 호출 얻을하지 않습니다 이 코드를 감안할 때 폐쇄?

+0

데모 용으로 jsfiddle.net 사용 – KarSho

답변

5

두 개의 복사본이 있습니다. 하나는 makesomething()이라고 할 때마다 만들어집니다.

x1.do === x2.dofalse입니다.

대신이 작업을 수행 할 경우

var doIt = function() { 
    this.x++; 
}; 
var makesomething = function (x) { 
    var thing = { 
     x: x 
    }; 

    thing.do = doIt; 

    return thing; 
}; 

var x1 = makesomething(1); 
var x2 = makesomething(2); 

그런 다음 모두 동일한 함수를 참조하고, x1.do === x2.dotrue 될 것입니다.

+0

개념적으로 "do"기능의 사본이 두 개 있지만 런타임에서 실제 "컴파일 된"코드의 복사본 하나만 유지하는 경우 일 수 있습니다. – Pointy

+0

@ go-oleg -'thing'은'do()'에 대한 액세스가'makesomething()'밖에서 사용 가능하게하는 방식 인 것입니다.'makesomething()'은 개념의 핵심 부분이 아닙니다. 'thing '이 없어도 직접'do()'를 반환하고 여전히'do()'의 사본이 두 개있을 것입니다. – nnnnnn

+0

@nnnnnn : 좋은 지적 –