关于Javascript中的函数关键字的困惑

时间:2018-02-14 19:58:32

标签: javascript

我一直在学习JavaScript,我在JavaScript中使用了函数关键字函数。在此更具体地说明其使用的三个不同的例子。特别是第二个例子中的new function让我感到困惑的是为什么新的,为什么不是资本F

var sum = new Function('a', 'b', 'return a + b');

console.log(sum(2, 6));
// expected output: 8


----------------------------------------------------------------

var apple = new function () {
    this.type = "macintosh";
    this.color = "red";
    this.getInfo = function () {
        return this.color + ' ' + this.type + ' apple';
    };
}


apple.color = "reddish";
console.log(apple.getInfo());
// expected output: "reddish macintosh apple"
--------------------------------------------------------------------


var getRectArea = function(width, height) {
    return width * height;
}

console.log(getRectArea(3,4));
// expected output: 12



-------------------------------------------------------------------------- 

2 个答案:

答案 0 :(得分:1)

new Function使用函数构造函数创建一个新函数(该函数名为'函数'大写' F')。

混淆来自这样的事实:在javascript中,构造函数的定义与任何其他函数一样(它们实际上是普通函数)。

const o = new function(){ this.foo = "bar"; };定义了一个匿名函数(恰好将内容分配给this,因此我们可以将其称为构造函数),并使用它来初始化一个新对象(仅由{{1}创建) }关键字)。它类似于:

new

唯一的区别是,在您的情况下,函数A没有名称,只在创建后立即使用一次。

上面的示例(几乎)类似于:

function A(){ /* ... */ };
const apple = new A;  // or `new A()` but the parentheses are facultative if
                      // there is no arguments

答案 1 :(得分:0)

new关键字与构造函数一起使用以创建对象实例。构造函数是函数,函数是一种对象。

按照惯例,构造函数首先以大写字母命名。 new Function()使用Function构造函数创建新的函数对象。它不是非常有用,但它可以用来动态创建可运行的代码(这也意味着它带来了许多潜在的风险)。
就像使用new创建的任何对象一样,结果是其构造函数的实例,在本例中为Function

new function() {}只使用匿名函数作为构造函数。函数体this内部将是正在创建的新对象实例。这并没有多大意义,因为实例化一个对象的目的是使它具有一个可识别的"类型"并从prototype获取属性,使用匿名函数作为构造函数都不可能。

var getRectArea = function(width, height) { return width * height; }只是创建一个函数并将其分配给名为getRectArea的变量。该函数可以用作构造函数,但在这种情况下,它只是一个返回值的常规函数​​。
该函数仍然是Function的实例,因此理论上它可以看作是使用new Function构造函数的简写,但实际上它意味着函数在运行时被解释,因此Javascript解释器可以语法检查并优化它,如果它被写为new Function("width", "height", "return width * height")

,它将被推迟到运行时