我需要在函数的作用域中定义一个变量,但是仅在第一次调用它时。该函数将被多次调用,因为它位于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时,我将无法执行此操作。我只需要第一次定义它,然后就可以将其添加到其中。如我所说,没有全局变量或类可以解决问题,但对我来说不切实际。
答案 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);
就是这样,我想避免每次都创建变量,但是哦。