JavaScript - Function核心对象的行为

Tom*_*ski 5 javascript

据我所知,在JavaScript(Gecko变体)中:

var a = new A();
Run Code Online (Sandbox Code Playgroud)

是这样的语法糖:

var a = {};
a.__proto__ = A.prototype;
A.call(a);
Run Code Online (Sandbox Code Playgroud)

因此,A()(相当于A.call()?)和新的A()应该产生两个不同的结果,如下所示:

>>> new Date()
Fri Nov 19 2010 01:44:22 GMT+0100 (CET) {}
>>> typeof new Date()
"object"

>>> Date()
"Fri Nov 19 2010 01:44:42 GMT+0100 (CET)"
>>> typeof Date()
"string"
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

但是,核心对象的Function行为有所不同:

>>> Function('return 123;')
anonymous()
>>> typeof Function('return 123;')
"function"
>>> Function('return 123;')()
123
>>> new Function('return 123;')
anonymous()
>>> typeof new Function('return 123;')
"function"
>>> new Function('return 123;')()
123
Run Code Online (Sandbox Code Playgroud)

我在这里错过了一些琐碎的事吗?

bob*_*nce 3

语言级别的 JavaScript 不指定使用构造函数的特定 \xe2\x80\x98standard\xe2\x80\x99 方式。当您定义自己的构造函数时,您可以选择将其作为构造函数(使用new)、函数(返回新对象)来调用,或者使其与其中任何一个一起使用。

\n
\n

我在这里错过了一些琐碎的事情吗?

\n
\n

并不真地。ECMAScript 第 15.3.1 节将构造Function函数定义为即使没有 也可用作构造函数:new

\n
\n

Function作为函数而不是构造函数调用时,它会创建并初始化一个new Function对象。因此,函数调用Function(...)相当于new Function(...)具有相同参数的对象创建表达式。

\n
\n

Date另一方面,该函数被定义为(由 ECMAScript 第 15.9.2 节)返回一个字符串:

\n
\n

当 Date 作为函数而不是构造函数调用时,它返回一个表示当前时间 (UTC) 的字符串。

\n

注意:该函数调用Date(...)并不等同于具有相同参数的对象创建表达式 new Date(...)。

\n
\n

注意之所以存在,是因为很多构造函数也可以在没有new. 这并不是因为所有构造函数都应该被允许作为普通函数工作,而是因为这正是 JavaScript 自 Netscape 早期以来一直在做的事情。Netscape 想不出有什么特别的事情可以Function()做,所以它只是复制了new功能。他们并没有过多关注使语言保持一致。

\n

如果你理智的话,你不会这样设计语言的默认类库。但 JavaScript 并不是一种理智的语言。这是一种失控的快速破解,在任何人花时间改进其设计之前就获得了广泛的流行。期望它表现一致,你只会失望。

\n