gpt4 book ai didi

javascript - 函数真的是一个对象吗

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:55:54 25 4
gpt4 key购买 nike

我是一名自学成才的 Web 开发人员,并且仍在努力掌握一些 JavaScript 基础知识。以下是从 Douglas Crockford 的 Good Parts 中摘录的一些引述。

“JavaScript 中的函数是对象”

“在 JavaScript 中,数组是对象,函数是对象,正则表达式是对象,当然,对象也是对象”

“每个对象都链接到它可以从中继承属性的原型(prototype)对象”(即构造函数、toString、...)

如果函数是对象那么为什么

 console.log(typeof Function);  // function 

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

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

它是它的'parent'的构造函数吗

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

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

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

它的原型(prototype)类型是函数而不是对象吗? 我认为它继承自 Object

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

最佳答案

If Function is an Object then why is its type a function and not object?

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

  • 对象(原生且未实现 [[Call]])返回“对象”
  • 对象( native 或主机并确实实现 [[Call]])返回“函数”
  • 对象(宿主并且不实现 [[Call]])返回一个实现定义的值,该值可能不是“undefined”、“boolean”、“number”或“string”。

[[Call]] 是对象的内部属性,将对象标识为函数(可调用)。非 native 对象是由宿主(例如浏览器)提供的对象,例如 DOM 对象或 ActiveXObject 的实例。

puzzled so the constructor is in-fact a function?

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

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

此外,来自 ECMAScript 规范:

Every built-in function and every built-in constructor has the Function prototype object, which is the initial value of the expression Function.prototype (15.3.4), as the value of its [[Prototype]] internal property.

Unless otherwise specified every built-in prototype object has the Object prototype object, which is the initial value of the expression Object.prototype (15.2.4), as the value of its [[Prototype]] internal property, except the Object prototype object itself.

还有,回答你最后的困惑:

The Function prototype object is itself a Function object (its [[Class]] is "Function") that, when invoked, accepts any arguments and returns undefined.

关于javascript - 函数真的是一个对象吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3941729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com