2013-08-21 84 views
1

默認情況下,這個打字稿代碼Typescript編譯的javascript「命名空間」模式的名稱是什麼?

module Demo { 
    export class HelloWorld { 
     sayHello() { 
      return "Hello World"; 
     } 
    } 
} 

編譯爲以下JavaScript

var Demo; 
(function (Demo) { 
    var HelloWorld = (function() { 
     function HelloWorld() { 
     } 
     HelloWorld.prototype.sayHello = function() { 
      return "Hello World"; 
     }; 
     return HelloWorld; 
    })(); 
    Demo.HelloWorld = HelloWorld; 
})(Demo || (Demo = {})); 

是否有此Javascript命名空間模式的名稱,是可行的編寫純JavaScript時使用它(例如有沒有更好的解決方案)?

回答

5

非常如此。主要原因是它防止名稱衝突。例如考慮下面的JavaScript代碼:

function format(str){ 
    // some dummy code 
    return str + " formatted"; 
} 

function format(num){ 
    // some dummy code 
    return num.toPrecision(10); 
} 

// beyond this point you cannot access format("str") version since it was replaced by format(number) 

隨着打字稿內部模塊,你可以只是做:

module stringUtils { 
    export function format(str:string){ 
     // some dummy code 
     return str + " formatted"; 
    } 
} 

module numberUtils{ 
    export function format(num:number){ 
     // some dummy code 
     return num.toPrecision(10); 
    } 
} 

stringUtils.format('some string'); 
numberUtils.format(123); 

此外,它可以讓你避免全局命名空間污染,當你想您的本地代碼,例如私人聚會考慮這種情況下:

module Utils{ 
    // Cache and compiled the regex 
    // This regext is not very useful outside this module 
    var trimRegex = RegExp("^\s+|\s+$"); 

    // This function is useful so we export it 
    export function trim(str:string) { 
     return str.replace(trimRegex,''); 
    } 
} 

// You cannot use trimRegex now. 
// Your namespace is clean 
// you can use Utils.trim though :) 

而作爲Steve Fenton mentions,這種模式在JavaScript中主動使用,以及(所謂的自執行的匿名功能)。

+2

+1 - 此模式的JavaScript名稱是「自我執行的匿名函數」,屬於該模式的這段代碼的一部分是......(function(){})();'。 – Fenton