Есть ли способ получить аргументы функции извне функции

#javascript #frontend

#javascript #интерфейс

Вопрос:

Я знаю, название может показаться запутанным.

Рассмотрим фрагмент, подобный этому

 function foo(){
  ...
}

var arr = [foo(1),foo(2),foo(3),...]
  

Я хочу найти способ извлечь эти аргументы из arr массива, чтобы получить что-то вроде этого
[1,2,3,...]

Кто-нибудь может мне помочь?

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

1. Итак, вы хотите просмотреть историю каждого аргумента, который был передан функции? Вероятно, было бы проще просто записать аргументы перед их передачей.

2. Хм… Это странный запрос, можем ли мы привести пример? Зачем тебе это нужно ? По сути, вы вызываете все функции, поэтому вы должны быть в состоянии знать, прежде чем

3. Простой ответ заключается в том, что это невозможно — так работает область видимости. В чем собственно проблема, из-за которой возникает вопрос?

4. вы можете вернуть аргумент функции

5. Вам нужно предоставить намного больше контекста. Например. было бы легко передать этот пример кода синтаксическому анализатору и извлечь аргументы из выражения вызова, но я думаю, это не то, что вы на самом деле хотите. Какую общую проблему вы пытаетесь решить?

Ответ №1:

Обычно этот тип операции выполняется наоборот. Вы можете объявить

 var arr = [1,2,3,...]
var foos = arr.map(n => foo(n))
  

Теперь у вас есть доступ как к исходным аргументам, так и к вашим результатам foo.

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

1. мне нравится этот подход. чистый и простой.

Ответ №2:

Как предполагают другие ответы, возможно, было бы лучше сохранить передаваемые вами аргументы перед их передачей.

Альтернативно, самым простым способом заполнить массив было бы вернуть ранее переданные аргументы, подобные этому:

 function foo(arg) {
   //does things
   return arg;
}

let arr = [foo(1), foo(2), ...]
  

Если функция используется для возврата чего-то другого, вы можете вернуть несколько вещей, вернув объект, подобный этому:

 function foo(arg){
   //does things
   return {
     thing: thing,
     arg: arg
   };
}

let arr = [foo(42).arg, ...]
  

Это своего рода передача одной и той же информации взад и вперед, но, как я понял, это именно то, что вы просили.

Ответ №3:

Если вы попытаетесь получить список из ОДНОГО-единственного аргументов:

     function foo() {
      /* .. */
      return arguments[0]
    }
    console.log([foo(1), foo(2), foo(3)]) // [1,2,3]  

Но это не работает для нескольких:

     function foo() {
      /* .. */
      return arguments[0]
    }
    console.log([foo(1), foo(2,3), foo(4,5)]) // [1,2,4]  

И этот способ поместит все аргументы в массив

     function foo() {
      /* .. */
      return arguments
    }
    console.log([...foo(1), ...foo(2,3), ...foo(4,5)]) // [1,2,3,4,5]  

Если вы не хотите использовать return оператор: В этом примере ВСЕ аргументы будут помещены в глобальный массив.

 let all_args = []

function foo() {
  Array.from(arguments).forEach(a => {
    all_args.push(a)
  })
  /*..*/
}

foo(1)
foo(2)
foo(3,4)
console.log("args:", all_args);   // [1,2,3,4]
foo(5)
console.log("args:", all_args);   // [1,2,3,4,5]

all_args = [] // Reset
foo(1,1,2,3,5)
console.log("args:", all_args); // [1,1,2,3,5]