2015-05-01 17 views
1

我有一個JavaScript函數,我想給函數傳遞給另一個函數,然後:查找函數中的所有全局引用?

  • 識別所有的函數中使用全局變量。
  • 標識函數中使用的所有全局函數調用。 [更難]
  • 已將此信息返回到obj中。
  • 乾淨地做。

例如:

function foo() { 
    var a; // ignored 
    global = 2; // want 'global' 
    bar(global); // want 'bar' 
}; 

var obj = identifier(foo); // Need to write this function 'identifier'! :) 
console.log(obj); // Produces: {globar:2, bar = bar()}; 

注:我在尋找一個乾淨的方式。我曾考慮將函數轉換爲字符串,解析每行並處理它。我覺得這可能不是一個傻瓜證明計劃,會有更好的方法。如果沒有更好的方法,我會回來分享我的解決方案。

謝謝

+4

我不認爲有任何其他方式,你必須將其轉換爲字符串。 – elclanrs

+1

javascript函數沒有編程訪問內部使用的變量/函數。您必須以字符串形式傳遞它並解析字符串。 – Krease

+0

什麼是原始任務?解決方案看起來很髒。 – zerkms

回答

2

您可以使用Esprima或其他JS AST解析器將功能到一個乾淨的結構。然後你可以遞歸地分析它。這是一個有點太大了,寫的StackOverflow的答案,但簡而言之,先從:

var ast = esprima.parse(foo); 

潛入.body,並遞歸分析它。尋找.type == "VariableDeclaration",這將包含局部變量。也看看你的功能.params,這些也是本地的。在掃描時,請查找.type == "Indentifier".type == "CallExpression";那些將使用變量和函數,所以檢查他們對你的本地變量列表。你需要通過兩遍,首先要收集當地人,然後找到全局。此外,如您發現.type == "FunctionDeclaration".type == "FunctionExpression",您必須創建一個新的作用域:將局部變量列表移動到類似於繼承的局部變量的位置,並創建一個新的局部變量列表,以便內部變量不會滲入外部作用域。

很多細節需要解決;您可以檢查ESTree項目以查看可能的節點類型。

最後,我會暫時同意zerkms:除非您正在編寫編輯器或類似的東西,否則這可能是一個XY問題。

+1

這真了不起。謝謝。今天會開始,可能會花一點時間。我會發布我的結果。我寫了一個nodejs模塊,並且花了很長時間來使API語法易於使用和合乎邏輯。 –

相關問題