代码之家  ›  专栏  ›  技术社区  ›  Q_Mlilo

函数真的是一个对象吗

  •  3
  • Q_Mlilo  · 技术社区  · 15 年前

    我是一个自学成才的web开发人员,仍在努力掌握JavaScript的一些基本知识。下面是一些引用道格拉斯·克罗克福德的好部分。

    “JavaScript中的函数是对象”

    “每个对象都链接到可以从中继承属性的原型对象” (即构造器,toString,…)

    如果函数是一个对象,那么为什么

     console.log(typeof Function);  // function 
    

    它的类型是函数而不是对象

     console.log(Object.constructor);  // Function()
    

     console.log(Function.constructor);  // Function()
    

    困惑 所以构造函数实际上是一个函数?

     console.log(typeof Function.prototype); // Function
    

    原型的类型是函数而不是对象吗?

    这些问题的答案将极大地帮助我理解JavaScript。

    5 回复  |  直到 15 年前
        1
  •  9
  •   Andy E    15 年前

    如果函数是对象,为什么它的类型是函数而不是对象?

    因为类型运算符的定义是这样的,可能是为了可用性:

    • Object(本机,不实现[[Call]])返回“Object”
    • 对象(本机或主机,并实现[[Call]])返回“function”
    • 对象(宿主,不实现[[Call]]) 返回一个实现定义的值,该值不能是“未定义”、“布尔”、“数字”或“字符串”。

    [[Call]]

    所以构造函数实际上是一个函数?

    为什么不呢?构造函数是函数。实例只能使用函数构造。 Object.constructor 是一个函数,但也是一个对象。请参见以下内容:

    console.log((function () { }) instanceof Object);
    //-> true
    

    每个内置函数和每个内置构造函数都有一个function prototype对象,它是表达式function.prototype(15.3.4)的初始值,作为其[[prototype]]内部属性的值。

    除非另有规定,否则每个内置原型对象都具有object prototype对象,即expression object.prototype(15.2.4)的初始值,作为其[prototype]]内部属性的值,但对象原型对象本身除外。

    同时,为了回答你最后的困惑:

    函数原型对象本身就是一个函数对象(它的[[类]]是“函数”),当被调用时,它接受任何参数并返回未定义的值。

        2
  •  4
  •   Ned Batchelder    15 年前

    当我们说“一个函数是一个对象”时,我们的意思不是“是”,而是“不是”,我们的意思是“猫是动物”。如果有人问你有什么样的宠物,你不会回答“动物”。 typeof 如果它总是回应,那就没用了 object .

    函数是一个对象,但对于 要返回,因为它是语言本身的静态质量,而不是运行时需要报告的内容。

        3
  •  1
  •   Jakob    15 年前

    typeof 如果运算符总是返回“object”,那它就没用了,不是吗?一切都是一个物体,但也可以是其他的东西。例如,字符串是一个对象,但它也是一个字符串:)运算符返回最特定类型(可以说,不是最通用类型)的名称。这应该可以解释为什么 typeof Function 是“功能”。

    至于 constructor 属性,构造函数是由运算符调用的函数 new 创建对象时。它总是一个函数,不管对象本身是否 Object , Function

        4
  •  0
  •   Buhake Sindi Tesnep    15 年前

    这个 console.log(typeof Function); 显示对象的类型 Function object .

    举个例子:

    function squareValue(var x) {
        return x * x;
    }
    

    可以松散地翻译为

    var squareValue = new Function("x", "return x*x");
    

    因此,这样做

    var valueSquared = squareValue(x);
    

    因此,为什么Javascript中的每个函数都是一个函数对象。

    这个 .constructor , .prototype .toString 在javascript上,对象/函数都是它们各自对象中的函数,因此输出为“Function”。

    这是根据 ECMA-262 3rd Edition -December 1999

    希望这有帮助。

        5
  •  0
  •   Community Mohan Dere    9 年前

    Is every JavaScript Object a function?

    javascript:alert([ window.navigator.userAgent, Object, Function ].join("\n\n") )
    

    显示器

    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 
          Ubuntu/10.04 (lucid) Firefox/3.6.3
    
    function Object() {
        [native code]
    }
    
    function Function() {
        [native code]
    }
    

    javascript:alert([ new Object, new Function ].join("\n\n") )
    

    [object Object]
    
    function anonymous() {  }
    

    javascript:alert([ new new Function ].join("\n\n") )
    

    显示器

    [object Object]