[英]Function expressions on global scope
在發現了TypeScript之后,我使用了在線編譯器,並且生成的JavaScript代碼讓我對函數表達式感到疑惑。
一個簡單的TypeScript類:
class Person {
firstName: String = "John";
lastName: String = "Doe";
}
結果在以下JavaScript代碼中:
var Person = (function () {
function Person() {
this.firstName = "John";
this.lastName = "Doe";
}
return Person;
})();
這讓我想知道為什么他們選擇使用自動執行功能,當更簡單的東西可能已經足夠時。 內部函數的名稱與變量名稱相同的目的是什么?
為什么他們沒有更簡單的東西,例如:
var Person = function() {
this.firstName = "John";
this.lastName = "Doe";
};
甚至:
function Person() {
this.firstName = "John";
this.lastName = "Doe";
}
據我所知,在全局范圍內使用函數表達式沒有任何優點,只有在聲明函數之前無法調用函數的缺點。
它有助於繼承。 它允許它們通過重命名為_super
捕獲基類,這有助於代碼生成,例如:
class Foo{
}
class Bar extends Foo{
}
成為:
var __extends = this.__extends || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
__.prototype = b.prototype;
d.prototype = new __();
};
var Foo = (function () {
function Foo() {
}
return Foo;
})();
var Bar = (function (_super) {
__extends(Bar, _super);
function Bar() {
_super.apply(this, arguments);
}
return Bar;
})(Foo); // Notice base class is captured here
這也是JS的好習慣。 例如,如果您在此示例中繼續使用Foo
而不是_super
並且您要更改基類,則可能會有一個令人頭疼的問題,這是可以避免的。
你真的不希望能夠在聲明執行之前調用一個類。 考慮以下代碼:
class Person {
static nameSeparator = ' ';
public fullName: string;
constructor(public firstName, public lastName) {
this.fullName = firstName + Person.nameSeparator + lastName;
}
}
它的生成形式:
var Person = (function () {
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.fullName = firstName + Person.nameSeparator + lastName;
}
Person.nameSeparator = ' '; // <-- Important!
return Person;
})();
您是否希望在指定的行之前意外運行的代碼以未定義的行為運行(在這種情況下,Person.fullName是“JohnundefinedSmith”),或者只是失敗?
在其他情況下,該課程根本不起作用:
class Person {
constructor(public firstName, public lastName) {
// Will fail until Person.prototype.getFullName gets set
console.log('New person, name = ' + this.getFullName());
}
getFullName() {
return this.firstName + " " + this.lastName;
}
}
這允許您創建一些私有變量。
在JS中:
var Person = (function () {
var firstName, lastName; //static private vars
function Person(fName, lName) {
firstName = fName;
lastName = lName;
}
return Person;
})();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.