2010-09-20 73 views
1

有沒有一種方法可以在JavaScript中關閉一個閉包來確定函數是什麼以及範圍是什麼?在JavaScript中關閉閉包

或者,也許更簡潔,有沒有一種方法可以在JavaScript中序列化閉包?

編輯

如果我給聲明的功能如下我想知道:

var o = {}; 
var f = function() { return o; } 

有沒有一種方式來看待剛剛f和發現Ø?

+0

*有沒有辦法只看f並找到o?當然有:'f()' - 儘管我想這不是你想到的。通常,函數體內的局部變量的行爲與私有類成員一樣,不可能從外部訪問它們。被包含在某個函數的閉包中並不會改變它(除非函數返回這些變量,否則使它們可訪問)。 – Tgr 2010-09-21 00:07:20

回答

1

如果我正確地理解了你(即使用你最近的編輯也很難說),答案是否定的。閉包的目的之一是封裝變量,限制對相關/相關代碼組的訪問(在全球範圍內分配),以儘量減少名稱衝突和/或意外交互。如果你想在全局範圍內訪問o,那麼你應該在那裏定義它。

+1

基本上,我正在尋找一種方法將一個閉包序列化爲一個字符串,以便繼續可以在過去頁面刷新時生活。 – MathGladiator 2010-09-21 02:53:55

+0

@MathGladiator這與閉包有什麼關係?你所說的話對我來說毫無意義。 – 2010-09-21 04:35:14

3

我不確定你的意思是「拆封」。確定哪些功能是可以使用arguments.callee的來完成:

function test() { console.log(arguments.callee); } 
// -> function test() { console.log(arguments.callee); } 

,什麼範圍?

檢查變量是否在範圍內的唯一方法是嘗試訪問它。這意味着如果你指的是未聲明的變量,你需要使用try/catch語句,因爲一個錯誤被拋出:

try{ myVar; alert("myVar is in scope"); }catch (e){ alert("myVar is not in scope"); } 

現實你已經知道哪些變量是在範圍上,如果你寫的代碼,甚至通過如果你沒有寫代碼的話,檢查代碼。

如果你想獲取堆棧,你可以(在某種程度上)做到這一點使用的呼叫者財產 ,但它是非標準的,可能無法使用在所有的JS實現 *

function getStack() { 
    var stack = [], cFunc = arguments.callee; 
    while (cFunc = cFunc.caller) 
     stack.push(cFunc); 

    console.dir(stack); 
} 

function func1() { func2(); } 
function func2() { try { obviousError(); } catch (e) { getStack(); } } 

大多數內置開發人員工具以更清晰的方式爲您提供堆棧(IE 7和IE 8沒有),因此最好在可能的情況下使用它們。

*目前所有主流瀏覽器都支持Function.caller。它似乎也是在ECMAScript 3.1中定義的 - 您可以查看支持here