2017-10-12 2 views
0

내 Angular 1.5 앱에서는 다른 서비스에서 다시 사용할 수 있도록 객체 또는 배열에 데이터를 저장하는 경우가 있습니다.내 서비스의 데이터를 효과적으로 메모리별로 재설정 할 수 있습니까?

(function() { 
     'use strict'; 

    angular 
     .module('myApp') 
     .factory('TemplateList', TemplateList); 

    function TemplateList() { 
     var templates = {}; 
    } 
})(); 

이 데이터를 지우고 다시 시작해야 할 때가 있습니다.

나는이 3의 기술은 가비지 컬렉션의 이용 효율을 최고로 것이다 확실하지 오전 :

  1. 템플릿 = {};

그냥 빈 개체로 지정하십시오.

  1. Object.assign (templates, {}); 새 ES6 기능을 사용하여 빈 개체로 지정합니다.

  2. angular.copy ({}, 템플릿) 사용은 각 기능 또한

, 그것은 더 복잡한 경우가 무엇인지 경우 내장? 예를 들어 기본 데이터가 있습니다. 예 :

var defaultData = { name: null, id: null }; 
templates = { name: 'hi', id: 5 } 

이렇게하면 효과가 없을 때마다 templates = defaultData입니다. 내 상황에서 가장 좋은 3 가지 기술은 어느 것입니까?

+0

'templates = {}' 메모리와 링크가 풀리면 GC가 메모리를 찾은 다음 메모리 내의 데이터를 삭제합니다. – sheplu

+0

조금 더 복잡하면 어떨까요? 예를 들어 기본 데이터가 있습니다. var defaultData = {name : null, id : null}; templates = {name : 'hi', id : 5} 이럴 때마다 템플릿 = defaultData가 좋지 않을까요? – user1261710

+0

변수와 메모리 사이의 참조를 풀면됩니다. GC는 '표시 및 스윕'이라고하는 것을 사용하여 메모리를 비 웁니다. MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management에서 더 많은 것들을 찾을 수 있습니다. – sheplu

답변

0

templates = {}은 성능면에서 좋습니다. 그러나 새로운 객체를 생성한다는 사실을 알고 있어야합니다. 컨트롤러 또는 다른 서비스 중 하나에서 이전 객체에 대한 참조가있는 경우 가비지 수집기로 이동하지 않습니다. 풍선 유추를 염두에 두십시오. 객체는 풍선이며 해당 객체를 참조하는 모든 변수는 문자열입니다. 모든 문자열이 끊어 질 때만 풍선이 가비지 컬렉터로 떠있게됩니다.

Object.assign()angular.copy()은 대상 개체에서 속성을 제거하지 않으므로이 작업에서는 올바르지 않습니다.

마지막 시나리오 인 templates = defaultData도 올바르지 않습니다. defaultData을 보존하고 templatesdefaultData을 복사한다고 생각하는 것 같습니다. 그건 사실이 아니야. templatesdefaultData이 참조하는 동일한 객체에 대한 새로운 참조 일뿐입니다. 같은 풍선, 지금은 두 개의 현.

여기에 angular.copy()을 사용해야합니다.

templates = angular.copy({}, defaultData); 

그 후 templates 변수에 할당 된 새로운 익명의 목적 상 복사 defaultData의 속성.

관련 문제