В чем разница между функциональным объектом и вызываемым объектом? - PullRequest
18 голосов
/ 22 мая 2009

Недавно я видел презентацию об изменениях в ECMAScript 5 . И было слайд с этим утверждением:

Функция против Возможность вызова

typeof f === 'function'                       // → f is Callable
({}).toString.call(f) === '[object Function]' // → f is a Function

Может кто-нибудь объяснить мне, в чем разница между Функция и Callable ?

1 Ответ

10 голосов
/ 22 мая 2009

Вообще говоря, объект может быть вызван без функции. В языке, где все является объектом (включая функции), вызываемые объекты не должны происходить из класса Function.

В JS похоже, что Callable - это все, что имеет внутренний метод [[Call]] (идентифицируется typeof «function», а не «object»). Функция (как используется на слайде) является потомком объекта Function. Я могу ошибаться, но внутри скрипта вы можете создавать только функции, в то время как реализация ECMAScript может определять функции, которые не являются функциями.

Если вы попробуете фрагмент кода со слайда как с анонимными функциями / выражениями функций, так и с объявленными функциями, результаты будут одинаковыми.

typeof function() {}; // == 'function'
({}).toString.call(function() {}) // == '[object Function]'
function foo() {}
typeof foo; // == 'function'
({}).toString.call(foo) // == '[object Function]'
...