括号包裹函数的新运算符(IIFE)

时间:2016-07-16 17:00:54

标签: javascript typescript

我通过对演示类的typescript代码的编译版本进行一些修改来获得以下代码。

function f() {
    function Demo() {
        console.log("Inside constructor");
    }
    return Demo;
}

var Demo = (f)();
console.log("Creating instance");
var demo = new Demo();

// Output
// Creating instance
// Inside constructor

删除IIFE后,

function f() {
    function Demo() {
        console.log("Inside constructor");
    }
    return Demo;
}

var Demo = f;
console.log("Creating instance");
var demo = new Demo();

// Output
// Creating instance

在第一种情况下,构造函数在Demo的调用上执行。在第二种情况下,调用Demo没有执行构造函数。 new运算符在每种情况下的行为如何?

2 个答案:

答案 0 :(得分:3)

var Demo = (f)();var Demo = f();相同。您致电 f并将返回值(演示功能)分配给Demo。)

var Demo = f;将f函数指定给Demo

new运算符的行为方式相同,只是将它应用于不同的值。

  

去除IIFE后

这里根本没有IIFE。

在IIFE中你有一个函数表达式(你只有函数声明),然后你立即用()跟它来调用它。

你有一个你打电话或不打电话的功能(f)。

答案 1 :(得分:1)

您没有删除IIFE,只需删除了一个函数调用(将f()转换为f)。

正确的转换看起来更像:

原始代码:

function f() {
    function Demo() {
        console.log("Inside constructor");
    }
    return Demo;
}

var Demo = f();

内联f

var Demo = (function f() {
    function Demo() {
        console.log("Inside constructor");
    }
    return Demo;
})();

内联Demo(将f缩减为下一步的单个表达式):

var Demo = (function f() {
    return function Demo() {
        console.log("Inside constructor");
    };
})();

删除IIFE(即将function () { return ...; }()转为...):

var Demo = function Demo() {
    console.log("Inside constructor");
};