typescript编译类和普通匿名函数之间的实际区别是什么?

时间:2017-02-23 10:38:53

标签: javascript typescript anonymous-function

在TypeScript中,假设存在一个简单的类Person3。

class Person3 {
    name: string
    constructor(public name: string) {
        this.name = name
    }
}

如果我们手工编写JavaScript,我们可能会写一个这样的函数:

var Person3 = function(name){
  this.name = name;
}

甚至可以使用纯函数语法:

function Person3(name){
  this.name = name;
}

但TypeScript编译为:

var Person3 = (function(){
  function Person3(name){
    this.name = name;
  }
  return Person3;
}());

一个变量,它包含一个包含匿名函数的表达式。此匿名函数包含并返回名称与变量名称匹配的命名函数。据我所知,匿名函数被称为内联。调用它时,返回指定的函数,然后在返回到表达式括号中时进行求值。

为什么这样?我确信一定有理由,但我仍然觉得我无法真正理解这里发生的事情。为什么不使用name = anonymous constructer?嵌套函数给我们带来了什么好处?

1 个答案:

答案 0 :(得分:2)

  

为什么这样?

IIFE适用于继承:

class A {
}
class B extends A {
}

...被转换为(使用ES3 / 5目标):

var __extends = // ...
var A = (function () {
    function A() {
    }
    return A;
}());
var B = (function (_super) {
    __extends(B, _super);
    function B() {
        return _super.apply(this, arguments) || this;
    }
    return B;
}(A));

注意引用父类的参数_super

但这种翻译很快就会过时。如果我们想手工编写JavaScript,对于现代JS引擎,我们可以写:

class Person3 {
    constructor(name) {
        this.name = name
    }
}