この記事では、JS 関数のパラメーター名を取得する方法について説明します。 ASTを使用してjs関数のパラメータ名を取得する方法の分析は、必要な友人が参考になれば幸いです。
最近のプロジェクトでは、関数のパラメーター名を取得するという要件があります。非常に単純に思えますが、ES6 ではパラメーターと関数があらゆる種類の奇妙な方法で記述されています。 github でいくつか調べてみましたが、ライブラリは基本的には一般的な記述方法をカバーできますが、境界を少し越えると正しく一致しないことがよくあります。
function x(a=5,b="a",c=function(x=1,y){console.log(x=function(i=8,j){})},d={x:1,y:2,z:'x=6'},e=x=>7,f=['3=5','x.1','y,2',1],g=(x,y)=>{let z=(i,j=6)=>{}},h){}
それから分析しましょう簡単な AST の例最初に簡単な例を見てみましょう:
function a(b){}
{ "type": "Program", "body": [ { // 这个type表示这是一个函数表达式 "type": "FunctionDeclaration", "id": { "type": "Identifier", "name": "a" }, "params": [ { // 参数数组内的Identifier代表参数 "type": "Identifier", "name": "b" } ], "body": { "type": "BlockStatement", "body": [] }, "generator": false, "expression": false, "async": false } ], "sourceType": "script" }
function getParams(fn){ // 此处分析的代码必须是字符串 let astEsprima=esprima.parseScript(fn.toString()) let funcParams = [] let node = astEsprima.body[0] // 找到type,进入params属性 if (node.type === "FunctionDeclaration") funcParams = node.params let validParam=[] funcParams.forEach(obj=>{ if(obj.type==="Identifier") validParam.push(obj.name) }) return validParam }
function a(x){} // 注意:第二条和第三条在AST中意义不同 let a=function(x=1){} a=function(...x){} let a=([x]=[1])=>{} async function a(x){} function *a(x){} class a{ constructor(x){} } new Function ('x','console.log(x)') (function(){return function(x){}})() eval("(function(){return function(a,b){}})()")
├──VariableDeclaration....init ├──FunctionExpression.params
その型が配置されている構文オブジェクトを取得します。も FunctionExpression 関数式です。
├──ExpressionStatement.expression ├──AssignmentExpression.right ├──FunctionExpression.params
オブジェクトを入力し、種類をコンストラクタとしてオブジェクトを検索し、パラメータのデータを取得します。 。
├──ClassDeclaration...body... ├──{kind:constructor} ├──FunctionExpression.params
関数コンストラクタ
├──NewExpression.arguments ├──{value:<String>} ---->对字符串进行处理,分割参数
アロー関数
関数構造の種類については以上です。
パラメータの構造
識別子: 最終的に取得する必要があるパラメータ値の種類
プロパティ: 存在する場合は、分解されたパラメーターです。たとえば、[a,b] または {x,y}
ArrayPattern: 構造化パラメーターが存在し、[a,b]
などの配列です。ObjectPattern: 構造化パラメーター{ x,y}
RestElement のようなオブジェクトが存在し、オブジェクトです。(...args)
のような展開演算子があります。再帰ループを設定するだけです。考え方は上と同じで、ある層が別の層に入り、中を見てください。
まとめ
この記事の主な目的は 1 つだけです。AST ツリー内の各オブジェクトの型分析を通じて、型は対応するコードの意味とコードのセマンティクスを表します。たとえば、
VariableDeclaration は次のようになります。 have inner init があるのは、変数宣言に初期値があるからです。これを設定しないと、
#type が今回言った以上のものになります。公式ウェブサイト (または Google) で詳細な紹介をご覧ください。以上がJS関数のパラメータ名を取得するにはどうすればよいですか? ASTを利用してjs関数のパラメータ名を取得する方法の解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。