函数对象和可调用对象有啥区别?
Posted
技术标签:
【中文标题】函数对象和可调用对象有啥区别?【英文标题】:What is the difference between a function object and a callable object?函数对象和可调用对象有什么区别? 【发布时间】:2010-10-28 04:20:33 【问题描述】:我最近看到了presentation about the changes in ECMAScript 5。还有一个slide 有这样的声明:
函数 vs 可调用
typeof f === 'function' // → f is Callable ().toString.call(f) === '[object Function]' // → f is a Function
谁能给我解释一下Function和Callable的区别是什么?
【问题讨论】:
链接已失效。 【参考方案1】:一般来说,一个对象可以被调用而不是一个函数。在一切都是对象(包括函数)的语言中,可调用对象不必来自 Function 类。
在 JS 中,看起来 Callable 是任何具有内部 [[Call]] 方法的东西(由 'function' 的 typeof 标识,而不是 'object')。函数(如幻灯片中所用)是函数对象的后代。我可能是错的,但是在脚本中你只能创建函数,而 ECMAScript 实现可以定义不是函数的 Callables。
如果您使用匿名函数/函数表达式和声明函数尝试幻灯片中的代码片段,结果是相同的。
typeof function() ; // == 'function'
().toString.call(function() ) // == '[object Function]'
function foo()
typeof foo; // == 'function'
().toString.call(foo) // == '[object Function]'
【讨论】:
为了启发 outis 的回应,这里是关于它是如何形成的讨论:bugs.ecmascript.org/ticket/153 更多信息:(function()).constructor; // → 函数原型 ().constructor; // → 对象原型 @FranCorpier 该链接不好。你能更新吗?看起来这可能是一个有趣的讨论。 @Icode4food:该票似乎不再存在于网站上,但 Wayback Machine 已将其存档:web.archive.org/web/20091228035416/http://bugs.ecmascript.org/… 那个链接现在也失效了以上是关于函数对象和可调用对象有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章