我通过对演示类的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
运算符在每种情况下的行为如何?
答案 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");
};