首页 > 解决方案 > 如何仅在第一次调用函数时在函数内定义变量?

问题描述

我需要在函数的范围内定义一个变量,但只是第一次调用它。该函数将被多次调用,因为它位于 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 每次被调用时都被不断定义为 0 时,我不能这样做。我只需要在第一次定义它,然后就可以添加它。正如我所说,没有全局变量或类,它们可以解决问题,但它们不适合我的使用。

标签: javascriptarraysfunctionvariables

解决方案


您可以在函数上设置属性,这可能与您想要做的最相似

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使用不同的参数再次调用,您希望如何让它处理迭代取决于您:)

这确实需要一些时间来适应,但是这些生成器真的很有用:)


推荐阅读