I'm using JavaScript Array Every method for some validation and when I'm passing arguments with some condition, then it's not working with JavaScript arrow lambda callbackFn
.
Let me describe the issue with simple example.
According to Array.prototype.every() documentation, it's syntax is:
every(callbackFn)
every(callbackFn, thisArg)
In this example I'm validating, all array elements are even or odd.
When I write array.every() method
callbackFn
as a normal JavaScript function, then validation is working.
This is example as follows:
const checkEven = function (num) {
console.log(this.isEven, num);
return num%2 === (this?.isEven ? 0 : 1);
}
evenArrary = [2, 4, 6, 8];
console.log('All elements are even: ', evenArrary.every(checkEven, {isEven: true}));
oddArray = [1, 3, 5, 7];
console.log('All elements are odd: ', oddArray.every(checkEven, {isEven: false}));
Now, I'm changing that callbackFn
as a JavaScript arrow lambda function, then passing argument is not working.
Example as follows:
const checkEven = ((num) => {
// 'this' is empty object here & this.isEven = undefined
console.log(this.isEven, num);
return num%2 === (this?.isEven ? 0 : 1);
});
evenArrary = [2, 4, 6, 8];
console.log('All elements are even: ', evenArrary.every(checkEven, {isEven: true}));
oddArray = [1, 3, 5, 7];
console.log('All elements are odd: ', oddArray.every(checkEven, {isEven: false}));
Now, I don't understand why passing arguments is not working when write callbackFn
as a arrow lambda function.
Why this is happening ? Is there any way to do this with arrow lambda callback function ?
As others have commented, arrow functions behave differently regarding this
.
However, you can make your code work with arrow functions like this:
const checkEven = thisArg => num => {
console.log(thisArg.isEven, num);
return num%2 === (thisArg?.isEven ? 0 : 1);
}
evenArrary = [2, 4, 6, 8];
console.log('All are even: ', evenArrary.every(checkEven({isEven: true})));
oddArray = [1, 3, 5, 7];
console.log('All are odd: ', oddArray.every(checkEven({isEven: false})));