如何仅在函数首次调用时在函数内定义变量?

时间:2019-05-19 22:39:26

标签: javascript arrays function variables

我需要在函数的作用域中定义一个变量,但是仅在第一次调用它时。该函数将被多次调用,因为它位于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++;
}

(这是一种假设情况,未使用的参数和变量不会打扰您)。

现在,如您所见,我需要遍历parameter2的数组,但是当d每次被不断地将d定义为0时,我将无法执行此操作。我只需要第一次定义它,然后就可以将其添加到其中。如我所说,没有全局变量或类可以解决问题,但对我来说不切实际。

2 个答案:

答案 0 :(得分:1)

您可以在函数上设置属性,这可能最类似于您想要做的事情

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 );

但是,另一个选择是改为使用a generator function,例如

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来重置函数,以及如何让其处理迭代由您决定:)

这确实需要一点时间来适应,但是这些生成器确实非常有用:)

答案 1 :(得分:0)

好吧,尽管我不想这样做,但最终还是上了课。老实说,这是最简单的答案,我必须做出让步,但至少可以奏效。如果有人需要知道如何操作,请按以下步骤操作:

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);

就是这样,我想避免每次都创建变量,但是哦。