2009-05-22 4 views
16

Недавно я увидел presentation about the changes in ECMAScript 5. И был slide с этим утверждением:В чем разница между функциональным объектом и вызываемым объектом?

Функция против отзывной

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

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

ответ

10

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

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

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

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

И просветить outis' ответ, вот дискуссия о том, как он пришел, чтобы быть: http://bugs.ecmascript.org/ticket/153 –

+0

Дополнительная информация: (функция() {}) .конструктор; \t // → Протокол функции ({}). Конструктор; \t \t // → Объектный прототип – ken

+2

@FranCorpier Эта ссылка плохая. Можете ли вы его обновить? Похоже, это может быть интересная дискуссия. – Icode4food

Смежные вопросы