You are currently viewing Как динамически получать names/values параметров функций javascript?

Как динамически получать names/values параметров функций javascript?

Дана любая произвольная функция JavaScript, и задача состоит в том, чтобы вернуть имена параметров функции.

Подход: JavaScript содержит метод, называемый Function.toString() который используется для представления кода функции в ее строковом представлении. Этот метод используется для получения имен/значений параметров.

  • Сначала приведите код функции к ее строковому эквиваленту, используя метод toString ().
  • Затем удалите все ненужные коды, такие как комментарии, текст функции, пробелы и стрелка ES6 (если таковые имеются).
  • Определите первое вхождение ‘(‘, оно будет как раз перед началом параметров.
  • Последним символом строки будет‘)’, который удаляет все комментарии, текст функции, пробелы и стрелку ES6.
  • Кроме того, последний символ будет сразу после окончания параметров.

Пример:

<script>

// JavaScript program to get the function
// name/values dynamically
function getParams(func) {
		
	// String representaation of the function code
	var str = func.toString();

	// Remove comments of the form /* ... */
	// Removing comments of the form //
	// Remove body of the function { ... }
	// removing '=>' if func is arrow function
	str = str.replace(/\/\*[\s\S]*?\*\//g, '')
			.replace(/\/\/(.)*/g, '')		
			.replace(/{[\s\S]*}/, '')
			.replace(/=>/g, '')
			.trim();

	// Start parameter names after first '('
	var start = str.indexOf("(") + 1;

	// End parameter names is just before last ')'
	var end = str.length - 1;

	var result = str.substring(start, end).split(", ");

	var params = [];

	result.forEach(element => {
		
		// Removing any default value
		element = element.replace(/=[\s\S]*/g, '').trim();

		if(element.length > 0)
			params.push(element);
	});
	
	return params;
}

// Test sample functions
var fun1 = function(a){ };

function fun2(a = 5*6/3, // Comment
	b){ };

var fun3 = (a, /*
	*/
	b, //comment
	c) => /** */{ };

console.log(`List of parameters of ${fun1.name}:`, getParams(fun1));
console.log(`List of parameters of ${fun2.name}:`, getParams(fun2));
console.log(`List of parameters of ${fun3.name}:`, getParams(fun3));
</script>

Выход:

List of parameters: List of parameters of fun1: [ 'a' ] List of parameters of fun2: [ 'a', 'b' ] List of parameters of fun3: [ 'a', 'b', 'c' ]