gpt4 book ai didi

javascript - chrome 主机环境是否使用全局构造函数实例化全局对象,例如对象、函数

转载 作者:行者123 更新时间:2023-12-01 00:54:19 27 4
gpt4 key购买 nike

我很好奇chrome(主机环境)为什么以及如何实例化全局对象,例如ObjectFunction

它是否使用全局 Function()Object() 构造函数以及为什么它提供构造函数(Function()、Object())和全局对象(对象,函数)都在窗口对象的环境中。

是因为环境需要同时提供(全局函数和构造函数)来创建用户脚本中定义的函数和对象,还是全局构造函数是多余的(因为它们已经实例化了自己的全局对象,即 Object、Function)

如果这听起来很愚蠢,我很抱歉,但我真的不明白函数对象的概念,并且可能是浏览器实现方式可以在隧道尽头阐明的方式。

谢谢。

最佳答案

在 JavaScript 中,函数就是对象。不要让自己对它们的名称感到困惑,ObjectFunction 都是函数(并且,像所有函数一样,它们也是对象)。考虑以下具有不同名称的示例:

function my_func() { return 42; }
my_func.property = "hello"; // Functions can have properties.
var my_var = my_func; // You can store functions in variables.
console.log(typeof my_var); // "function"
console.log(my_func()); // 42
console.log(my_var()); // 42
console.log(my_var.property); // "hello"

我可以写“function Object() {...}”,而不是“function my_func() {...}”。 (当然,这会与内置的 Object 函数发生奇怪的冲突。)

与所有函数一样,Object 不是由自身构造的。调用 new Object() 会为您提供一个空对象(就像编写 {} 一样),这与 Object 函数不同。这些函数的定义内置于 JavaScript 引擎中;它们在启动时使用未暴露给 JavaScript 的特殊内置代码进行实例化。

在上面的示例中,观察 ... = my_func 如何引用该函数,以及 ... = my_func() 如何调用它。同样,Object() 实际上是一个引用 Object 的两部分表达式 (Object + ()) 函数并调用它。因此,从逻辑上讲,使用 Object() 来创建 Object 是不可能的,因为这需要使用尚不存在的东西!换句话说,提供“两者”ObjectObject() 是同一件事:提供了 Object,并且由于它是一个函数,因此您可以使用 () 调用它。

也许另一个例子会有帮助。在典型的 JavaScript 代码中,您有用户定义的构造函数,例如:

function Fruit(color) {
this.color = color;
}
Fruit.shape = "curved";

var banana = new Fruit("yellow");
console.log(typeof Fruit); // "function"
console.log(typeof banana); // "object"
console.log(banana.shape); // undefined
console.log(banana.constructor.shape); // "curved"
console.log(banana === Fruit); // false
console.log(banana.constructor === Fruit); // true

观察调用 new Fruit() 作为构造函数不会为您提供 Fruit 函数(就像调用 new Object() 一样)没有给你 Object 函数)。您可以将属性放在Fruit(它是一个函数,也是一个对象)上,访问它们就像访问任何其他对象属性一样。

关于javascript - chrome 主机环境是否使用全局构造函数实例化全局对象,例如对象、函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56715012/

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