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

Gum*_*mbo 19 javascript function callable

我最近看到了有关ECMAScript 5变化演示文稿.这句话有一张幻灯片:

功能可调用

typeof f === 'function'                       // ? f is Callable
({}).toString.call(f) === '[object Function]' // ? f is a Function
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释一下FunctionCallable之间的区别是什么?

out*_*tis 11

一般而言,对象可以在不作为函数的情况下调用.在一切都是对象(包括函数)的语言中,可调用对象不必从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]'
Run Code Online (Sandbox Code Playgroud)

  • 为了启发outis的回应,这里讨论它是如何形成的:http://bugs.ecmascript.org/ticket/153 (3认同)
  • @FranCorpier这个链接很糟糕.你能更新一下吗?看起来这可能是一个有趣的讨论. (3认同)
  • 那条链接现在已经死了 (3认同)