不是';难道不是所有的JavaScript函数都是构造函数吗?

不是';难道不是所有的JavaScript函数都是构造函数吗?,javascript,eval,Javascript,Eval,我以一种奇怪的方式使用eval函数作为构造函数 try { var y = new eval() } catch(error) { console.log("caught a " + error.name + ": " + error.message); } 它抛出的错误是 caught a TypeError: function eval() { [native code] } is not a constructor 如错误消息所示,eval是一个函数,但不是构造函数 try

我以一种奇怪的方式使用
eval
函数作为构造函数

try {
  var y = new eval()
} catch(error) {
    console.log("caught a " + error.name + ": " + error.message);
}
它抛出的错误是

caught a TypeError: function eval() { [native code] } is not a constructor
如错误消息所示,eval是一个函数,但不是构造函数

try {
  var y = new eval()
} catch(error) {
    console.log("caught a " + error.name + ": " + error.message);
}

问题是,难道不是所有javascript函数都充当构造函数吗?

并非所有函数都是构造函数

构造函数是,不是所有函数都有。这在语言规范中有明确的规定:

函数对象不一定是构造函数,此类非构造函数函数对象没有[[Construct]]内部方法


使用
new
Reflect.construct
调用非构造函数,因为构造函数抛出
TypeError

eval是一个保留关键字/本机函数。不,其他一些不可忽略的例外是一些DOM方法和箭头函数
x=>未定义
同意,eval是一个内置函数。如果您创建了自己的
函数myEval(){}
,然后使用该代码,则应该可以。您可以参考以更好地理解两者之间的差异。这有什么实际意义?如果我编写一个javascript函数,它是否会自动用这个[[Construct]]内部方法进行标记?@johncarcenter,这取决于函数是如何创建的。正如@PaulS在上面指出的,使用arrow函数语法创建函数意味着它将不具有[[Construct]]属性。使用
函数
关键字通常会生成一个可构造的函数。嗯,把它添加到我不知道的事情列表中。