JavaScript新的Function表达式和新的Function构造函数

时间:2016-06-21 21:14:45

标签: javascript function constructor new-operator

我的问题是关于使用new function(){ ... }而不是new Function();

生成的对象

到目前为止我的理解/假设

  • 当我们使用Function()或new Function()创建一个函数时,我们得到一个配置为函数的对象(它的内部插槽表示一个函数类型对象)
  • 无论是否使用new运算符,Function()构造函数都会返回一个新的函数对象
  • 使用函数表达式返回一个内部使用Function()构造函数的函数对象
  • 函数表达式提供了解析函数体的优化

我的问题

根据我的上述假设,为什么new Function();new function(){ ... }会返回不同的内容?

第一个返回一个函数对象,但后者返回一个标准对象。鉴于引擎盖下的函数表达式使用Function()构造函数,为什么后者的行为与new Function();的行为不同?

使用new function(){ ...}我希望有一个函数对象,而不是标准对象。

2 个答案:

答案 0 :(得分:2)

以下几行基本相同:

function foo(...) {...}
var foo = function (...) {...};
var foo = new Function (...);

它们都声明了一个新函数(它是一个对象,它是Function的一个实例,它继承了当前作用域中的Object原型,...),可以通过foo变量。

new关键字从函数中实例化一个对象,该函数允许您使用标准OOP语言创建类似于类实例的内容。

继续上面的例子:

var bar = new foo(...)

将在当前作用域中实例化foo函数的实例,该实例可以通过bar变量访问。

  

为什么new Function();new function(){ ... }会返回不同的内容?

我要稍微改写一下这个例子。而不是:

new Function()
//and
new function(){ ... }

我打算使用

new Function()
//and
var foo = function () { ... };
new foo();

new Function()返回与new foo()不同的内容的原因完全是因为Functionfoo的功能不同。

我希望您不会因new Object()返回具有与new Array()不同的功能的其他对象这一事实而感到困惑。完全相同的事情发生在这里。

  

鉴于引擎盖下的函数表达式使用Function()构造函数,为什么后者的行为与new Function();的行为不同?

后面的表达基本上是:

new (new Function ( ... ))

答案 1 :(得分:1)

new Function(...)返回一个新的函数,而new function(){...}返回一个新的 Object

基本上,函数只是评估一段代码的一种方法。

对象是一种在javascript中存储数据的方式。

旁注:你可以在技术上做到

new (new Function(...))

返回一个新对象。