2010-11-29 3 views
5

메모리 소비 측면에서 볼 때 이들이 동일합니까? 아니면 후자의 모든 객체에 대해 새 함수 인스턴스를 얻나요?익명 함수 및 메모리 소비량

var f=function(){alert(this.animal);} 
var items=[]; 
for(var i=0;i<10;++i) 
{ 
    var item={"animal":"monkey"}; 
    item.alertAnimal=f; 
    items.push(item); 
} 

var items=[]; 
for(var i=0;i<10;++i) 
{ 
    var item={"animal":"monkey"}; 
    item.alertAnimal=function(){alert(this.animal);}; 
    items.push(item); 
} 

내가 제대로 작동하려면 폐쇄 위해서는 그 생각하고

편집, 두 번째 인스턴스는 실제로 새로운 기능을 각 패스를 만들 것입니다. 이 올바른지?

답변

5

두 번째 방법은 인터프리터가 해당 줄을 통과 할 때마다 함수를 만들기 때문에 첫 번째 방법을 사용해야합니다.

편집에 관해서 : 자바 스크립트는 블록 범위가 아닌 기능 범위를 가지고 있기 때문에 항상 일 수도 있고 일 수도 있습니다.하지만 모든 것을 만들지 않는 구현이 발생하지 않았습니다. 시각. 이 기술을 광범위하게 사용하면 지원이 부족한 구현이 메모리 제한을 초과 할 수 있기 때문에이 (아마도 가능할 수있는) 최적화에 의존하지 않을 것을 권장합니다. 어떤 구현이이 기술을 실행할 지 모르므로 그다지 좋지 않습니다.

1

저는 전문가는 아니지만, 다른 자바 스크립트 엔진이 다른 방식으로 이것을 처리 할 수 ​​있다고 생각합니다.

예를 들어 V8에는 숨겨진 클래스라는 것이 있는데, 이는 동일한 속성에 액세스 할 때 메모리 소비에 영향을 줄 수 있습니다. 어쩌면 누군가가 이것을 확인하거나 부정 할 수 있습니다.