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

20

我最近看了关于ECMAScript 5变化的演示文稿。其中有一张幻灯片上写着这样的话:

Function vs Callable

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

有人能向我解释一下FunctionCallable之间的区别吗?


链接已经失效。 - RBT
1个回答

13

一般来说,一个对象可以是可调用的,而不一定是一个函数。在一种语言中,所有的东西都是对象(包括函数),可调用的对象不必从Function类继承。

在JS中,Callable是指具有内部[[Call]]方法的任何东西(通过typeof标识为'function',而不是'object')。 Function(如幻灯片中使用的)是Function对象的后代。 我可能错了,但是在脚本中,您只能创建Functions,而ECMAScript实现可以定义不是Functions的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 - Fran Corpier
更多信息:(function(){}).constructor; // → 函数原型 ({}).constructor; // → 对象原型 - ken
3
@FranCorpier,那个链接有问题,请更新一下。看起来这可能是一个有趣的讨论。 - Icode4food
@Icode4food:网站上似乎已经没有这张票了,但是Wayback Machine对其进行了归档:http://web.archive.org/web/20091228035416/http://bugs.ecmascript.org/ticket/153 - outis
3
那个链接现在也失效了。 - Tim Seguine
@TimSeguine,链接现在已经上线了。 - RBT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接