2012-07-02 101 views
0

在js中,我们有一个名为“函数”的函数。 它的一个实例返回一个函数:“功能”是功能,这怎么可能?

var myfunc = new Function('arg1','arg2','return arg1+arg2'); 

在该示例中的可变MYFUNC包含返回两个给定则params的总和的函数。

我的问题是 - 这怎么可能函数是一个函数?它不能成为它自己的一个实例。 和对象也是一个函数,一个实例函数。但是函数对象的一个实例,因为函数是对象。

而且我不明白这怎么可能,这是一个无限循环......

感谢。

+0

你在调用Function的构造函数。我可能会对使用'new'关键字做一些研究。 –

+0

当事情停止在JavaScript中实现并在运行时实现时,就会出现某些问题。这是其中的一个接缝,我会想象:)。 – Corbin

+0

@Corbin:这不是真的与它有关。 Function.toString() ===“function Function(){\ n [native code] \ n}”',即它*是一个函数。 – ThiefMaster

回答

1

微不足道的答案是“因为ECMA-262这么说”。

Function,Object,Array,Date等对象是内置对象,所以它们不是以通常的方式构建的,它们只是。他们之间的关系,他们的原型和他们的[[Prototype]]由环境根据ECMA-262建立。所以功能inherits from its own prototype(即Function.prototype === Function[[Prototype]]),它继承自Object.prototype。

2

ObjectFunction等确实是功能 - 构造函数是确切的。

记住,你创建一个对象是这样的:

function MyObject() { 
    this.foo = 'bar'; 
} 

var my = new MyObject(); 
alert(my.foo); 

顺便说一句,使用new Function(...)通常是一个坏主意。你的榜样会是这样干净得多:

function myfunc(arg1, arg2) { return arg1 + arg2 } 

var myfunc = function(arg1, arg2) { return arg1 + arg2 }; 

所以有在生产中使用new Function()几个原因(模板引擎是一个好用例虽然)。

+0

这是一个例子,我不这样做,但我想知道它是如何工作的。 –

+0

但是再次 - _Function_如何是它自己的一个实例? –

+0

@iiddaannyy:这不是一个*实例*,因为'Function'构造函数被调用来创建'Function'构造函数。显然这是不可能的。 'Function'构造函数是由底层实现创建的,并被赋予必要的属性,以便'instanceof'将其解释为“Function”的一个实例。 – 2012-07-02 22:46:17