JavaScript调用回调函数时如何额外传递参数?
如何给回调函数传递额外参数?
我想给定义好的回调函数设置额外参数,现有代码如下:
// 最小长度验证器 function minLengthValidator(input, minLength) { console.log("长度是", input.length, "最小长度是", minLength); return input.length >= minLength; } // 在validate函数中使用回调(比如用于输入框验证),仅传入输入值 function validate(callback) { let exampleInput = "myText"; let valid = callback(exampleInput); return valid; } // 调用validate函数 validate(minLengthValidator);
现在的问题是,validate函数只给回调传输入值,那怎么给minLengthValidator传递minLength参数?我目前可以用自定义函数包裹调用:
validate((value) => { return minLengthValidator(value, 4);});
有没有更简洁的实现方式?
几种更优的实现方式
1. 使用 Function.prototype.bind()
bind() 方法可以创建一个新函数,预先绑定指定的参数,新函数被调用时只会接收input参数:
validate(minLengthValidator.bind(null, undefined, 4));
如果调整验证器的参数顺序,让minLength排在前面,写法会更简洁:
// 调整验证器参数顺序 function minLengthValidator(minLength, input) { console.log("长度是", input.length, "最小长度是", minLength); return input.length >= minLength; } // 用bind预先绑定minLength validate(minLengthValidator.bind(null, 4));
bind的第一个参数是要绑定的this值,这里不需要改变函数的this指向,传null或undefined即可。
2. 柯里化验证器函数
把验证器改造成柯里化函数,先接收minLength参数,返回一个只接收input的函数,刚好匹配validate的回调要求:
// 柯里化的最小长度验证器 function minLengthValidator(minLength) { return function(input) { console.log("长度是", input.length, "最小长度是", minLength); return input.length >= minLength; }; } // 调用时直接传入minLength,得到的函数就是符合要求的回调 validate(minLengthValidator(4));
用箭头函数可以简化成一行:
const minLengthValidator = minLength => input => { console.log("长度是", input.length, "最小长度是", minLength); return input.length >= minLength; }; validate(minLengthValidator(4));
3. 封装验证器工厂函数
如果需要扩展多种验证规则,可以写一个工厂函数,根据参数生成对应的验证回调:
function createMinLengthValidator(minLength) { return function(input) { console.log("长度是", input.length, "最小长度是", minLength); return input.length >= minLength; }; } // 使用工厂函数生成验证回调 validate(createMinLengthValidator(4));
内容的提问来源于stack exchange,提问作者Tim Gabrikowski
相关产品推荐
相关产品推荐

