noisy takes a function as a parameter, and returns a function. The thing you pass it is expected to be a function. We can see that in this line here:
let result = f(...args);
f is the parameter. That line of code using it as a function.
noisy gives you a function back. We can see that here in the code:
return (...args) => {
The important thing is that a function is not the same as the value returned by a call to the function. Math.min is a function, a thing. Math.min(1, 2, 3) is a call to a function, an action -- which returns a number. When you put the parentheses on Math.min, that tells the compiler you want to execute Math.min.
Math.min(1, 2, 3) doesn't return a function, it returns a number. The code you were given isn't passing that parameter list to Math.min; it's passing that parameter list to a completely different function, the one returned by noisy.
This becomes more clear if we assign the values to local variables:
// x is a function, not a number.
var x = Math.min;
// y is a function: noisy returns a function.
var y = noisy(x);
// Call the function noisy returned:
var z = y(1, 2, 3);
If we break down your version of the call, noisy(Math.Min(3,2,1)), we get this:
// Set x equal to the integer value 1
var x = Math.min(3, 2, 1);
var y = noisy(x);
Look inside noisy. It returns a function which includes the following line:
let result = f(...args);
So, in your version, y is the function that noisy returns. It's never executed, but if it were, it would be trying to treat the integer value 1 as a function. But an integer is not a function.