“Object”是JavaScript中的函数吗?

“Object”是JavaScript中的函数吗?,javascript,prototype,Javascript,Prototype,考虑这一功能: function Foo(){ var a = "3"; }; function Foo() { var a = "3"; // a is local to this scope, you cannot get to it from outside console.log(a); // prints 3 - local variable a is accessible inside the scope of this function

考虑这一功能:

function Foo(){
    var a = "3";
};
function Foo() {
    var a = "3"; // a is local to this scope, you cannot get to it from outside
    console.log(a); // prints 3 - local variable a is accessible inside the scope of this function
    console.log(Foo.a); // prints 5 - a is a property on object Foo, and is accessible here
}
// var a inside Foo cannot be accessed here
Foo.a = 5;
Foo();
根据,

我理解这一部分,但如果我在谷歌Chrome控制台中这样做:

Object.__proto__
output: ƒ () { /* native code */ }

Function.__proto__
output: ƒ () { /* native code */ }
Q1:为什么它们指向函数?实际上什么是
函数
对象
以及它们之间的区别,因为
对象
实际上是一个函数

typeof Object
"function"
Q2:如果一切都是JavaScript中的对象,那么为什么
object
是函数?另外,函数实际上是如何在JavaScript中实现的?函数中声明的变量会发生什么变化?JavaScript编译器是否将函数转换为对象


对不起,如果我遗漏了一些明显的东西。函数和对象在JavaScript中的实现方式让我非常困惑。

Q1:为什么它们指向函数?

A1:因为它们是函数<代码>函数和
对象
只是构造函数

函数是一个
函数对象
。对象是
对象对象

Q2:如果一切都是JavaScript中的对象,那么为什么
object
是函数?

A2:因为
对象
只是一个构造函数

对象的类型
//“功能”
新对象的类型()
//“对象”
函数是
函数
的一个实例,因此函数就是一个对象

(function(){})函数的实例
//真的

对象
是所有对象的构造函数。因此,
typeof Object==“function”

下面是一个用于可视化的片段:

console.log(对象类型)//函数(对象类型)
var object=new object()//对象“class”的实例
console.log(对象类型)//对象
console.log(object instanceof object)//true,因为object是由object()创建的。

函数
有一些可以执行的代码
对象
是包含数据的对象

对于具有
x
y
的类

class Point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
    isOrigin() { return x == 0 && y == 0; }
}
let p = new Point();
答案1

其中,
p
是包含数据或其他函数的
对象

p.isOrigin
是一种功能

类似地,类
本身就是一个
函数
,当运行时产生
p
。这就是为什么像
对象
函数
这样的所有类都是
函数
更准确地说是
构造函数

答案2

如果一切都是JavaScript中的对象,那么为什么
object
是函数呢

与答案1相同

另外,函数实际上是如何在JavaScript中实现的

不同的JavaScript引擎将有不同的实现。他们有需要遵循的规范

函数中声明的变量会发生什么变化

离题。每个
函数
都在一个范围内运行,该范围保存该函数的所有数据

JavaScript编译器是否将函数转换为对象


不确定您在问什么。

函数和对象都是构造函数,可分别用于创建函数和对象,这是函数返回
函数的原因

关于函数和对象在JavaScript中的关联性,请考虑以下几点:

  • 所有非基本类型都是JavaScript中的对象
  • 所有对象直接或间接继承自Object.prototype(除非使用setPrototypeOf显式更改prototype)
  • 所有本机函数都继承自Function.prototype,后者继承自Object.prototype,因此这意味着函数间接继承自Object.prototype,因为函数在JavaScript中被视为对象
  • 函数被视为对象的原因是,它们可以作为参数传递给其他函数,并且可以从函数(即高阶函数)返回(javascript的一个强大功能)
  • 可以使用
    ()
    操作符调用函数,因为JavaScript引擎知道它是使用function关键字声明的,并且具有可执行代码。因此,每当调用它时,JavaScript引擎都会创建一个新的执行上下文,并设置
    this
    绑定,然后执行该函数。当您尝试调用一个对象时,所有这些都不会发生,而是会抛出一个错误,即“不是函数”

    因此,我们可以说并非每个对象都是函数,因为它们可能没有使用function关键字声明,也没有可执行代码

  • 由于函数在JavaScript中被视为对象,我们可以向其添加属性,并从中创建新对象
  • 无法使用
    ()
    调用非函数类型对象,因为它没有可执行代码,并且未使用function关键字声明。相反,它是使用
    newobject()
    或对象表示法声明的,并包含方法和属性

  • 我希望它能澄清这两个问题。

    您似乎混淆了“对象”(数据结构)和
    对象(函数)

    对象是JavaScript中的一个概念,是某些数据的通用容器。对象包含具有键和关联值的属性

    在JavaScript中,所有不是对象的东西都是对象。这包括函数,它们基本上是一种特殊类型的对象,可以用
    ()
    语法“调用”

    JavaScript提供了许多具有各种用途的内置函数。两个这样的函数恰好被称为
    Object
    Function
    。换句话说,对象是一个函数,因此也是一个“对象”(数据结构)

    让我们拿你的func
    function Foo() {
        var a = "3";
    }
    
    Foo.bar = 5;
    Foo.bar++;
    console.log(Foo.bar); // prints 6
    
    function Foo() {
        var a = "3"; // a is local to this scope, you cannot get to it from outside
        console.log(a); // prints 3 - local variable a is accessible inside the scope of this function
        console.log(Foo.a); // prints 5 - a is a property on object Foo, and is accessible here
    }
    // var a inside Foo cannot be accessed here
    Foo.a = 5;
    Foo();
    
    function Bar() {
        this.a = 10;
        console.log(this == Bar); // prints false
    }
    var bar = new Bar();
    console.log(bar.a); // prints 10
    
    console.log(bar.constructor == Bar) // prints true
    console.log(bar.__proto__ == Bar.prototype) // prints true