1

默认情况下,此 Typescript 代码

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 时使用它是否可行(例如,有没有更好的解决方案)?

4

1 回答 1

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 提到的,这种模式也在 JavaScript 中被积极使用(称为自执行匿名函数)。

于 2013-08-21T12:23:34.957 回答