javascript - 如何仅在第一次调用函数时在函数内定义变量?
问题描述
我需要在函数的范围内定义一个变量,但只是第一次调用它。该函数将被多次调用,因为它位于 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 时,我不能这样做。我只需要在第一次定义它,然后就可以添加它。正如我所说,没有全局变量或类,它们可以解决问题,但它们不适合我的使用。
解决方案
您可以在函数上设置属性,这可能与您想要做的最相似
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
使用不同的参数再次调用,您希望如何让它处理迭代取决于您:)
这确实需要一些时间来适应,但是这些生成器真的很有用:)
推荐阅读
- php - 使用参数上的 if 条件更新 postgres
- logic - 计算以下逻辑表达式的合取范式
- python - Python中的欧几里得算法
- c# - 如何删除字符串中的最后 5 个字符?
- python - os.system 不起作用,但命令行 wokrs
- intellij-idea - Intellij 没有在打字时换行
- python - python中的基本问题
- python-3.x - 如何在套接字 Python 中为 recvfrom 设置超时
- amazon-deequ - 在 deequ 中添加新的建议规则
- google-apps-script - 在我的代码中找到此错误 TypeError: Cannot read property 'getLastRow' of null (line 5, file "Code")