Typescript编译的javascript"命名空间"模式的名称是什么?

Dan*_*nte 1 javascript namespaces typescript

默认情况下,这个Typescript代码

module Demo {
    export class HelloWorld {
        sayHello() {
            return "Hello World";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编译成以下Javascript

var Demo;
(function (Demo) {
    var HelloWorld = (function () {
        function HelloWorld() {
        }
        HelloWorld.prototype.sayHello = function () {
            return "Hello World";
        };
        return HelloWorld;
    })();
    Demo.HelloWorld = HelloWorld;
})(Demo || (Demo = {}));
Run Code Online (Sandbox Code Playgroud)

这个Javascript命名空间模式是否有名称,在编写纯Javascript时是否可以使用它(例如,有没有更好的解决方案)?

bas*_*rat 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)
Run Code Online (Sandbox Code Playgroud)

使用打字稿内部模块,您可以这样做:

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);
Run Code Online (Sandbox Code Playgroud)

此外,当您需要代码本地的私有函数时,它允许您防止全局命名空间污染,例如考虑这种情况:

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 :) 
Run Code Online (Sandbox Code Playgroud)

正如Steve Fenton所提到的,这种模式也在JavaScript中被广泛使用(称为自执行匿名函数).

  • +1 - 此模式的JavaScript名称是"自执行匿名函数",此代码中属于该模式的部分是...`(function(){})();`. (2认同)