【问题标题】:JavaScript new Function confusionJavaScript 新函数混淆
【发布时间】:2013-12-14 15:41:00
【问题描述】:

在阅读 Learning JavaScript 2nd edition 时,我在第 13 章:创建自定义 JavaScript 对象中看到了一段代码。

var oneOff = new Function () {
    this.variablea = "variablea";
    this.method = function () {
        return xxx;
    }
}

据说是一样的:

var oneOff = new Object();
oneOff.variablea = "variablea";
oneOff.method = function () {...};

但我不知道 new Function () {..} 是什么。任何帮助表示赞赏。谢谢。

【问题讨论】:

  • MDN上查找?
  • 这个用法和MDN上提到的“new Function ([arg1[, arg2[, ...argN]],] functionBody)”不一样
  • 我认为你误读了这个例子,因为你的问题陈述的是完全错误的。第一段代码是语法错误,您可以通过在浏览器控制台中输入来验证。
  • 是的,如果使用大写字母“F”,这是一个语法错误,而且这似乎是书中的错字(我手头有它,正在阅读第 312 页,所以我确定作者是使用“功能”)。但由于这本书是几年前出版的,我不确定这在过去是否曾经是一种合法的语法。

标签: javascript function object


【解决方案1】:

使用 new function() { /* */ } 时,您创建的不是新函数,而是对象。
它只是带有构造函数的 new 的标准用法,例如:

var oneInstance = new ConstructorFunction();

function ConstructorFunction() {
         this.var1 = 'val1';
         this.method1 = function() { } ;
}

不同之处在于构造函数是在实例化的时候定义的,我们省略了调用函数,这是合法的(虽然我觉得很混乱)。

我发现有些括号更清晰,并且明确地调用了构造函数:

var oneOff = new  ( function () {
  this.variablea = "variablea";
  this.method = function () {
    return xxx;
  };
} ) () ;

但如果只创建一个对象,人们宁愿使用简单的对象表示法:

var oneOff = {
  variablea : 'valuea',
  method    : function () { return xxx; }
}

他们的表现如何比较?

对于 new function() {} 方法,创建对象需要首先创建一个函数,然后在“新”上下文中执行该函数。 另一方面,object litteral 只是创建......一个对象,所以它的时间更少,创建的垃圾也更少。

关于这两种对象的使用性能(读/写属性/使用方法的时间)很难说,因为所有的 javascript 解释器都非常复杂且非常不同。他们何时以及如何决定优化代码的一部分是您在进行基准测试之前无法真正知道的事情。 - 由于那些“随机”优化,基准测试也不是一件容易的事。我敢打赌,它们的使用性能应该非常接近,如果您花时间做一些措施,请告诉我们。

【讨论】:

  • 添加的括号让我很清楚。据我所知,最后一个 () 是可选的。就性能和编译器解释而言,这与对象字面量相同吗?
【解决方案2】:

new function(注意F是小写的)是在Javascript中创建对象的众多方法之一。解释代码后,一个对象将被分配给具有variableamethod 属性的oneOff

实现此目的的另一种方法是使用对象字面量表示法:

var oneOff = {
    variablea:"variablea",
    method:function () {
        return xxx; //this will be undefined
    }
}

如果您只需要oneOff 的一个实例,这很好用,但是如果您需要oneOff 的多个实例,您可以使用如下的函数构造函数:

function OneOff(){
    this.variablea = "variablea";
}

OneOff.prototype.method = function(){
   return xxx; //one again undefined
}

var firstOneOff = new OneOff();
var secondOneOff = new OneOff();

【讨论】:

  • 有人想解释反对意见吗?有兴趣了解我在这方面的进展情况。
  • 我投了赞成票。您介绍的方法确实是典型的用法。我总是附在函数语句和函数文字上,因为人们很清楚我在做什么。
  • @WaiKitKung 感谢您的支持,希望这对您有所帮助。我总是有兴趣听取那些不赞成投票的人的意见。如果这是一个合法的反对票,并且他们解释了他们的理由,那么您将从 SO 中获得最大的价值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
相关资源
最近更新 更多