Как определить переменную внутри функции только при первом ее вызове? - PullRequest
2 голосов
/ 20 мая 2019

Мне нужно определить переменную в области видимости функции, но только при первом ее вызове. Функция будет вызываться несколько раз, потому что она находится внутри цикла for, поэтому определение переменной каждый раз, когда она вызывается, сделает эту переменную непригодной для использования, поскольку мне нужно, чтобы она сохраняла желаемое значение. Я не хочу использовать класс, потому что тогда мне нужно будет создавать новый экземпляр класса каждый раз, когда я хочу использовать функцию, и я не могу использовать глобальную переменную, потому что тогда многократные вызовы функции будут изменить эту переменную в разное время, и это будет просто беспорядок. Рассмотрим этот код:

for(var i = 0; i < x; i++){
    myFunction(parameter1, parameter2, parameter3);
}

Цикл for будет повторяться x раз, и функция будет вызываться также x раз. Теперь рассмотрим определение функции:

function myFunction(parameter1, parameter2, parameter3){
    var a = 5;
    var d = 0;

    parameter2[d].method();
    d++;
}

(Это гипотетическая ситуация, неиспользуемые параметры и переменные не должны вас беспокоить).

Теперь, как вы можете видеть, мне нужно пройти через массив параметра 2, но я не могу этого сделать, когда d постоянно определяется как 0 каждый раз, когда он вызывается. Мне нужно, чтобы это было определено только в первый раз, а затем оно может быть добавлено к нему. Как я уже сказал, глобальные переменные или классы не могут решить проблему, но они непрактичны для моего использования.

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Вы можете установить свойство для функции, которое, вероятно, будет наиболее похожим на то, что вы хотите сделать

function increaseCaller( args ) {
  let d = increaseCaller.d || 0;
  args[d]( d );
  increaseCaller.d = d + 1;
}

function log( arg ) {
  console.log( 'log: ' + arg );
}

function warn( arg ) {
  console.log( 'warn: ' + arg );
}

function error( arg ) {
  console.log( 'error: ' + arg );
}


const params = [log, warn, error];

increaseCaller( params );
increaseCaller( params );
increaseCaller( params );

однако другой вариант - использовать функцию генератора вместо

function *methodCaller( args ) {
  let d = 0;
  while (d < args.length ) {
    yield args[d](d);
    d++;
  }
}

function log(arg) {
  console.log('log: ' + arg);
}

function warn(arg) {
  console.log('warn: ' + arg);
}

function error(arg) {
  console.log('error: ' + arg);
}


const params = [log, warn, error];

const iterator = methodCaller( params );

iterator.next();
iterator.next();
iterator.next();

Теперь, это может быть не совсем то, что вам нужно, однако оно позволяет вам сбросить функцию, просто снова вызывая methodCaller с другими аргументами, и то, как вы хотите, чтобы он обрабатывал итерации, зависит от Вы:)

Для этого нужно немного привыкнуть, но эти генераторы действительно полезны:)

0 голосов
/ 20 мая 2019

Хорошо, так что я закончил с использованием класса, несмотря на то, что я не хотел.Честно говоря, это самый простой ответ, я должен пойти на компромисс, но, по крайней мере, он работает.Если кому-то нужно знать как, вот как:

class myClass{
    constructor(){
        this.d = 0;
    }

    someMethod(parameter1, parameter2, parameter3){
        this.a = 0;
        parameter2[this.d].method();
        this.d++;
    }
}

Затем, когда вы захотите его использовать, вы определяете переменную, которая содержит объект этого класса.

var someVar = new myClass();

ТогдаВы можете использовать переменную в другом месте, например:

someVar.someMethod(parameter1, parameter2, parameter3);

Вот и все, я хотел избежать создания переменных каждый раз, ну да ладно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...