在 JavaScript 中,函數透過保留指向其封閉範圍的隱藏連結來形成閉包。這就提出了一個問題:當函數可用作變數值時,是否可以以程式方式存取此閉包?
此查詢背後的主要動機是理論上的,但實際應用可能涉及列出閉包的屬性。考慮以下程式碼:
<code class="js">var x = (function(){ var y = 5; return function() { alert(y); }; })(); //access y here with x somehow</code>
目標是使用函數 x 存取變數 y。
在前端環境中,您可以在其中執行在您的 JavaScript 之前的腳本標記中,一種方法是附加 MutationObserver。該觀察者等待您要檢查的腳本標記(在本例中為 x)插入到文件中,並修改其程式碼以公開所需的功能。
例如:
<code class="js">new MutationObserver((mutations, observer) => { // Find the target script tag const tamperTarget = document.querySelector('script + script'); if (!tamperTarget) { return; } observer.disconnect(); console.log('Target script getting tampered with'); // Modify the script's content to expose the closure tamperTarget.textContent = tamperTarget.textContent.replace( 'return function', 'window.y = y; return function' ); setTimeout(() => { console.log("Hacked into tamper target's script and found a y of", y); console.log('Could also have replaced the local y with another value'); }); }) .observe(document.body, { childList: true });</code>
此腳本將觀察者附加到 document.body。當插入包含x函數的腳本標籤時,觀察者觸發,並將行返回函數替換為window.y = y;返回函數。這會將 y 變數公開為全域變數 (window.y)。
隨後,您可以根據需要存取和操作 y 變數。這種技術對於閉包的調試、測試和實驗非常有用。
以上是您可以在 JavaScript 中以程式設計方式存取函數的閉包嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!