#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
будет неточно с параметрами restfunction bar(a, ...b) {}
. Следовательно, почему важно понимать, что считается «чрезмерным» или нет. Если это не совпадает с JSfn.length
, то вы можете использовать анализатор AST для определения функции для проверки параметров.
Ответ №1:
Вы можете получить копию arguments
и срез с функциями length
определенных параметров.
function fn(a, b) {
return [...arguments].slice(fn.length);
}
console.log(fn(1, 2, 7)); // 7
Комментарии:
1. Хорошая работа, спасибо! Теперь, может ли существовать функция, которая захватывает это из fn() ?