Можно ли использовать ссылку на атрибут вызова какой-либо функции и передать его как значение?
Это не работает:
-> f = Number.prototype.toLocaleString.call
<- ƒ call() { [native code] }
-> typeof f
<- "function"
-> f(1)
<- Uncaught TypeError: f is not a function
at <anonymous>:1:1
Можно ли ссылаться и использовать некоторые функции call
"метод" и использовать его как обычную функцию?
2 ответа
Решение
Проблема в том, что любая функция call
свойство эквивалентно Function.prototype.call
, который не может быть вызван сам по себе, без вызывающего контекста:
console.log(Number.prototype.toLocaleString.call === Function.prototype.call);
Решение состоит в том, чтобы явно дать вновь созданной функции контекст вызова исходной функции, что можно сделать с помощью bind
:
const f = Number.prototype.toLocaleString.call.bind(Number.prototype.toLocaleString);
console.log(f(3333));
Нет, call
это метод (наследуется отFunction.prototype.call
) и, как и любой общий метод, должен быть привязан к своей цели, если вы хотите использовать его как простую функцию. В этом случае целевой объект являетсяtoLocaleString
функция:
const f = Function.prototype.call.bind(Number.prototype.toLocaleString);
console.log(f(1));