函数对象和可调用对象之间有什么区别?

时间:2009-05-22 09:41:10

标签: javascript function callable

我最近看到了presentation about the changes in ECMAScript 5。这句话有一个slide

  

功能 vs Callable

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

有人可以向我解释功能 Callable 之间的区别是什么?

1 个答案:

答案 0 :(得分:10)

一般来说,对象可以在不作为函数的情况下调用。在一切都是对象(包括函数)的语言中,可调用对象不必从Function类继承。

在JS中,看起来像Callable是具有内部[[Call]]方法的任何东西(由'function'类型标识,而不是'object')。函数(在幻灯片中使用)是Function对象的后代。我可能错了,但在脚本中你只能创建函数,而ECMAScript实现可以定义不是函数的Callables。

如果您尝试使用匿名函数/函数表达式和声明函数的幻灯片中的代码片段,结果是相同的。

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