我很好奇铬(主机环境)为什么以及如何实例化诸如$data = get_posts( array( 'post_title' => 'Gallery','post_status'=>'inherit') );
,Object
之类的全局对象。
它是否使用全局Function
,Function()
构造函数,为什么它在以下环境中同时提供构造函数(Function(),Object())和全局对象(Objects,Function)窗口对象。
是因为提供环境(同时提供全局函数和构造函数)对于创建用户脚本中定义的函数和对象是必需的,还是全局构造函数是多余的(因为它们已经实例化了自己的全局对象,即Object,Function)
很抱歉,这听起来很愚蠢,但是我真的没有得到函数对象的概念,这可能是浏览器实现的方法可以在隧道的尽头阐明这一点。
谢谢。
答案 0 :(得分:2)
在JavaScript中,函数是对象。不要让自己对它们的名称感到困惑,Object
和Function
都是函数(并且像所有函数一样,它们也是对象)。考虑以下具有不同名称的示例:
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
,因为这将需要使用尚不存在的东西!换句话说,同时提供Object
和Object()
都是一样的:提供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
(作为函数,它也是一个对象)上,对其进行访问就像访问其他任何对象属性一样。