Javascript 在调用回调函数时添加参数

Javascript add param when calling a callback function

提问人:Tim Gabrikowski 提问时间:3/19/2023 更新时间:3/19/2023 访问量:63

问:

我想在定义回调函数时为回调函数设置额外的参数。


// min Length validator
function minLengthValidator(input, minLength) {
    console.log("Length is", input.length, "min Length is", minLength);
    return input.length >= minLength;
}

// using the callback in an validate function (e.g. on an Input field) and only give it the input value
function validate(callback) {
    let exampleInput = "myText";
    let valid = callback(exampleInput);
    return valid;
}

// call the validate function
validate(minLengthValidator);

但是如何在函数上设置 minLength 属性呢?该值由 validate 函数传入,但如何传递 minLength?minLengthValidator

您始终可以为每个函数定义一个自定义函数,并在其中调用 minLengthValidator 函数:

validate((value) => { return minLengthValidator(value, 4);});

但是有没有更好的方法呢?

JavaScript 函数 验证 回调

评论


答:

1赞 tkausl 3/19/2023 #1

函数式编程为我们提供了轻松解决这个问题的工具。

// min Length validator
function minLengthValidator(minLength) {
    return function(input) {
        console.log("Length is", input.length, "min Length is", minLength);
        return input.length >= minLength;
    }
}

validate(minLengthValidator(5));
0赞 Unmitigated 3/19/2023 #2

您可以切换 的参数顺序,然后使用 Function#bind 设置第一个参数的值。minLengthValidator

function minLengthValidator(minLength, input) {
    console.log("Length is", input.length, "min Length is", minLength);
    return input.length >= minLength;
}
function validate(callback) {
    let exampleInput = "myText";
    let valid = callback(exampleInput);
    return valid;
}
console.log(validate(minLengthValidator.bind(null, 4)));

评论

0赞 Tim Gabrikowski 3/19/2023
很好的答案,有效,但我不喜欢绑定每个电话。我知道我没有澄清我的用例,但稍后它将是一个包含函数的数组,然后绑定到每个条目不是我想要的。但感谢您的回答!学到了新东西!nullvalidatorsnull
0赞 Unmitigated 3/19/2023
@Tim-Gabrikowski 在这里只是设置函数的上下文。您根本不使用该值,因此它不会影响任何内容(只有第一个参数之后要绑定的参数会影响参数值)。但是你使用什么风格取决于你。nullthisthis
0赞 Tim Gabrikowski 4/18/2023
你能告诉我如何使用多个参数来做到这一点,比如如果我想只构建一个将 和 length 作为参数的验证器?你对此有想法吗?lengthminmax
0赞 Unmitigated 4/18/2023
@TimGabrikowski 这是同样的想法:例如,where 取两个参数,顺序为最小值、最大值。lengthValidator.bind(null, 3, 5)lengthValidator