UNPKG

foop

Version:

interfaces that describe their intentions.

81 lines (73 loc) 2.38 kB
const ObjectProperties = require('../util/props') const traverse = require('../traverse') const isObj = require('../is/obj') const isArray = require('../is/array') const keys = require('../util/keysObjOrArray') // function gc() { // if (typeof window !== 'undefined') window.global = window // if (typeof global.gc === 'function') global.gc() // } /** * @since 4.0.0 * @desc remove all methods, mark for garbage collection * * @param {Object} obj object to traverse and clear * @return {void} * * @see https://stackoverflow.com/questions/1947995/when-should-i-use-delete-vs-setting-elements-to-null-in-javascript * @see https://v8project.blogspot.ca/2015/08/getting-garbage-collection-for-free.html * @see https://github.com/natewatson999/js-gc * @see https://github.com/siddMahen/node-gc * @see http://buildnewgames.com/garbage-collector-friendly-code/ * @see https://stackoverflow.com/questions/27597335/ensuring-object-can-be-garbage-collected * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management * * @TODO blacklist = [] param * @TODO put all GC events into a cached map and debounce the operation * * @example * * var scoped = {} * var ref = () => scoped * var obj = {scoped, ref, eh: true} * * markForGarbageCollection(obj) * //=> void * * obj * //=> undefined|{} * */ function markForGarbageCollection(obj) { // @TODO: ArrayOrObj loop... like tons of libs do... // let props = isObj(obj) ? ObjectProperties(obj) : obj //isArray(obj) ? obj let props = keys(obj) for (let p = 0; p < props.length; p++) { if (isObj(obj[p])) { markForGarbageCollection(obj[p]) } delete obj[p] } // traverse(obj).forEach(function(x) { // const {value} = this // // // @NOTE: just delete the main path first, later we can use cleaner // // const shouldIgnore = path // // .map(pathPart => ignore.includes(pathPart)) // // .includes(true) // // !shouldIgnore && // // /* istanbul ignore else: safety for bottom up */ // // ensure the longest paths in traverser are used... // if (!isArray(value) && !isObj(value)) { // this.remove() // } // }) // simple fast easy cleanup // for (let p = 0; p < props.length; p++) { // delete obj[p] // } props = undefined obj = undefined } module.exports = markForGarbageCollection