在嘗試將函式保存在單獨的命名空間中并嘗試釋放不再需要的命名空間消耗的記憶體時,我偶然撰寫了這個代碼,甚至沒有考慮它正在N從它自己的方法之一中洗掉命名空間的事實,N.loader(). 起初,我unload('N')在.finallyunload()
即使注入的腳本 deletes window.N,它也會在執行之前從方法的最后.then()一個執行。N.loader()finally
因此,我很困惑這是否真的從記憶體中洗掉了命名空間及其方法,或者只是使它們無法從剩余的 JS 代碼中訪問。
你能解釋一下這是如何在幕后作業的嗎?在方法完成執行之前,如何洗掉方法的父物件?
謝謝你。
"use strict";
try {
window.N = new Object();
window.N.loader = function() {
fetch(url, {})
.then( response => {})
.then( data => {
return fetch(url,{});
})
.then( response => {
})
.then( data => {
unload('N');
let d = new DOMParser(),
b = d.parseFromString( data, 'text/html' );
// inject new script.
// console.log( window.N ) => undefined.
})
.catch( error => {
console.error('Error:', error);
})
.finally( () => {
// too late to delete window.N.
// New script already injected.
});
}; // Close window.N.loader
function unload(f) {
console.log( delete window[f] ); // => true
}
window.N.loader();
} catch (err) {
console.log(err);
} finally {
}
uj5u.com熱心網友回復:
是的,它可以 - 需要注意的是。您實際上并沒有洗掉該物件。相反,您只是洗掉了window 屬性和記憶體中的物件之間的鏈接。
當 youdelete時,該屬性的物件仍然存在。如果沒有其他東西參考它,通常它會在幾秒鐘內收集垃圾。如果其他東西仍然有對它的參考,除非其他東西發生變化,否則它永遠不會被垃圾收集。
舉一個更簡單的例子:
(() => {
const theNamespace = {
fn() {
delete window.propertyA;
}
};
window.propertyA = theNamespace;
window.propertyB = theNamespace;
})();
window.propertyA.fn();
console.log(window.propertyB);
或僅使它們無法從剩余的 JS 代碼中訪問
是的,只要某物參考了同一個物件,該物件就會保留(大部分情況下 - 參見mark 和 sweep)。如果您 delete window.N,其他對的參考window.n將停止作業 - 但如果其他東西在其他屬性或識別符號中參考了同一物件,則這些參考將繼續作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/477452.html
標籤:javascript 目的
上一篇:無論是使用Promises執行同步函式還是異步函式,如何有效地呼叫公共函式?[復制]
下一篇:Vue觸發請求從API獲取資料
