javascript:函数也是对象 - 是真还是假?

时间:2013-06-26 21:20:01

标签: javascript function object prototype

我正在潜入(或尝试)高级javascript主题,如原型,构造函数,函数属性等等。一些事实让我得出结论, javascript函数也是对象

我知道函数的数据类型为function,因为:

> typeof function(){}
'function'

但无论如何:

  • 您可以为函数指定属性(就像它是一个对象一样)
  • 函数具有length属性
  • Function.prototype的原型是Object.prototype(原型链接):

    > Object.getPrototypeOf(Function.prototype) === Object.prototype
    true
    

有人可以说清楚javascript函数是否是对象?如果是这样,为什么typeof function == 'function'typeof [] == 'object';如果不是 - 我上面提到的要点怎么样?

编辑:还有一个问题 - 什么是第一类对象

4 个答案:

答案 0 :(得分:4)

所有(几乎)都是javascript中的对象。

Function instanceof Object  // true

答案 1 :(得分:2)

是的,函数是javascript中的对象。这就是为什么((function(){}) instanceof Object是真的。

typeof function == 'function',因为它们也是功能。函数继承自Object原型。

使用object initializerobject literalsarray literalsnew Constructor进行实例化的任何内容都将具有“对象”类型。

答案 2 :(得分:0)

这部分已经被其他答案解决了,但是,函数是对象。所以,关于你的其他问题。

  

为什么typeof function =='function'和typeof [] =='object'

typeof运算符遵循规范中定义的某个set of rules

Type of val                    Result
----------------------------------------------
Undefined                      "undefined"
Null                           "object"
Boolean                        "boolean"
Number                         "number"
String                         "string"
Object (native and does        "object"
not implement [[Call]])        
Object (native or host and     "function"
does implement [[Call]])
Object (host and does not      Implementation-defined except may 
implement [[Call]])            not be "undefined", "boolean", 
                               "number", or "string".
  

什么是头等对象?

据说JavaScript中的函数是“第一类对象”或“第一类公民”,因为作为常规对象,它们可以分配给变量,传递给其他函数,并由其他函数返回。这就是JavaScript的功能性。

答案 3 :(得分:0)

我在早期学习JavaScript时遇到了这个问题。这是JavaScript的核心概念:函数ARE对象。但是,对象不一定是函数。原因? “函数”类型表示适用于其他对象和变量的过程或方法。因此,他们选择名称“function”而不是创建一个名为“function object”的类型。即使在最高级别的程序员中,这也造成了进一步的混乱。

但简单地说,功能是对象。因此,它们也可以包含自己的属性(就像任何对象一样)。此时,您可以创建此函数包含的私有变量/对象以及每个新实例获取的对象。需要注意的是,函数中包含的任何对象都不具有全局范围。 “Object.prototype”中的对象具有全局范围(并且始终存在)。

要回答您的上一个问题,第一类对象通常是在传递,创建或修改方式方面没有限制的实体。下一级(第2级,第3级......)具有限制其使用的限制层。显然,所有这些用例都很好。

编辑:我知道每个人都要他死。但请查看Douglas Crocford的教诲。他很好地研究了高级JS。