Это не работает:
-> 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
функции "метод" и использовать его как обычную функцию?
Проблема заключается в том, что любая функции 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));
typeof f === "function"
действительно сбивает меня с толку ....call
любой функции в точности.call
свойством любой другой функции. Также я не получаю эту ошибку; Я получаю жалобу, что.call()
вызывается сthis
значением, которое не является функцией (что я и ожидал).