Функция JS для извлечения первого избыточного аргумента другой функции

#javascript #function #arguments

Вопрос:

У меня есть небольшое интересное задание: создать функцию JS, которая при вызове из другой функции возвращает первый избыточный аргумент, переданный этой функции.

Напр.

 /**
* Returns first excessive argument of a function, if any
* @param {function} context - function to refer to
*/ 
function getExcessiveArgument( context ){
   // I know I cannot access arguments and length like that, 
   // but that's what I'd do if I could.
   // arguments being the array of all arguments, 
   // length - the number of expected arguments
   return context.arguments[ context.length ]; 
}

function ReturnExcessive(a,b){
   // this is NOT correct as well, 
   // but I would pass called function's context there, if I could
   return getExcessiveArgument( this );  
}

ReturnExcessive( 1,2,7); // Should return 7  
 

Альтернативой может быть вызов функции getExcessiveArgument с аргументами и длиной, но я не могу понять, как получить доступ к длине даже из родительской функции.

Можно ли вообще написать подобную функцию в JS или я зря трачу время?

Заранее спасибо!

Комментарии:

1. Хорошо function f(a, b) {} , что звонок f(1, 2, 7) 7 был чрезмерным. А как насчет function g(a, b = 0) {} того, что в вызове g(1, 2, 7) есть 2 или 7 первый чрезмерный аргумент?

2. @ВЛАЗ да, функция. длина перестает работать с первым параметром со значением по умолчанию, поэтому в соответствии с JS 2 и 7 в данном случае не являются чрезмерными аргументами. К несчастью. На самом деле это убивает всю идею, поэтому я думаю, что то, что я пытался выяснить, вообще невозможно.

3. Это правильно, fn.length учитываются только объявленные параметры без дефолта. Также не будет записываться, если у вас есть function foo() { return arguments[0] arguments[1]} — так как функция не объявляет параметры, length будет равно нулю, даже если она использует arguments для получения первых двух. Кроме того, length будет неточно с параметрами rest function bar(a, ...b) {} . Следовательно, почему важно понимать, что считается «чрезмерным» или нет. Если это не совпадает с JS fn.length , то вы можете использовать анализатор AST для определения функции для проверки параметров.

Ответ №1:

Вы можете получить копию arguments и срез с функциями length определенных параметров.

 function fn(a, b) {
    return [...arguments].slice(fn.length);
}

console.log(fn(1, 2, 7)); // 7 

Комментарии:

1. Хорошая работа, спасибо! Теперь, может ли существовать функция, которая захватывает это из fn() ?