2016-02-05 17 views
2

是否有任何能夠在JavaScript中獲得閉包變量列表(好吧,也許所有範圍變量)?在Javascript中獲取閉包變量列表

樣品:

function factory(){ 
    var _secret = "Some secret"; 
    return function(code){ 
     // How to get parent function variables names here? 
     // ... 
    } 
} 

var inside = factory(); 

inside(); 
+1

不可能,這不可能。 – Grundy

+0

_ //如何獲得父函數變量名稱?_ - 您可以使用_secret直接。你想要別的東西嗎? – Grundy

+0

@Grundy我需要「獲取閉包變量列表(好吧,也許所有範圍變量)」。我不知道我有哪些閉包變量。 –

回答

3

假設這是用於調試的目的,你可以嘗試解析函數體中,發現評估標識符:

function getvars(fn, _eval) { 
 
    var words = String(fn).replace(/".*?"|'.*?'/g, '').match(/\b[_A-Za-z]\w*/g), 
 
     ret = {} 
 
    words.forEach(function(w) { 
 
     try { ret[w] = _eval(w) } catch (e) {}; 
 
    }); 
 
    return ret; 
 
} 
 

 
function factory() { 
 
    var _secret = "Some secret"; 
 
    var _other = "Other secret"; 
 

 
    return function(code){ 
 
     var vars = getvars(factory, _ => eval(_)); 
 
     return vars; 
 
    } 
 
} 
 

 

 
vars = factory()(); 
 
document.write('<pre>'+JSON.stringify(vars,0,3));

不用說,這是對付代碼極其原始的方法,小心處理它。

+0

我喜歡這個解決方案。我是新手。請給出一些關於下面的表達式的信息?:_ => eval(_) –

+0

在我的情況下,我有我的js代碼運行在關閉其他lib函數(我的代碼將被評估),所以你的解決方案看起來不錯(是的,我需要這個只是爲了調試)。主要問題是找到這個外部函數的名字。 –

+1

@blindProgrammer這是ES6箭頭函數https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions –

1

有沒有全面的方式來獲得在範圍內的所有變量的列表。你可以枚舉this對象,但這仍然只會給你一個枚舉對象列表this,甚至在那裏仍然會有像函數參數那樣的東西不在this上。

所以不行,這是做不到的。還請看看這個similar question

1

不,這是不可能的。 ECMAScript規範不向任何地方的最終用戶公開Enviroment Record對象。

0

由於閉包的主要概念是範圍,並且閉包內的變量是私有的,所以如果不通過某種方法暴露它們,就無法實現這一點。

你真的想達到什麼目的?