JavaScript中良好作用域的方式

tug*_*erk 7 javascript scope

我不是一个非常好的JavaScript用户,但我可以用它完成任务.我对我用JavaScript编写的代码感到自豪,所以我决定改变它.这是我的第一步:

我正在尝试为项目创建自己的库,下面是初始结构.

window.fooLib = {};

(function (foo) {
    "use strict";

    foo.doSomeStuff = function(param1) { 

        console.log(new AccommProperty(param1));
    }

    //some internal function
    function AccommProperty(nameValue) { 
        var _self = this;
        _self.name = nameValue;
    }

}(fooLib));
Run Code Online (Sandbox Code Playgroud)

我在这里使用了立即调用的函数表达式来初始化我的变量.在这种情况下它是fooLib.

我不确定我是否应该做一些其他事情以使其window.fooLib更安全.我的意思是,如果我正确理解JavaScript,它可以被我的代码之后运行的任何其他代码覆盖.

你的想法是什么?

Ber*_*rgi 1

如果你想防止覆盖你的变量,你可以使用Object.defineProperty()writable:false,configurable:false。在你的情况下:

(function () {
    "use strict";
    var foo = {};
    //some internal function
    function AccommProperty(nameValue) { 
        var _self = this;
        _self.name = nameValue;
    }
    foo.doSomeStuff = function(param1) { 

        console.log(new AccommProperty(param1));
    }
    Object.defineProperty(window, "foolib", {value:foo});
}());
Run Code Online (Sandbox Code Playgroud)

尽管如此,这仍然没有充分的理由。它需要 EcamScript 5.1 才能工作,并且周围没有垫片;也许带有 getter/setter 的东西可以防止=操作符覆盖。

而且,没有必要让你的库不可重写。只是不要在您的网站上使用覆盖该库的代码。或者也许有人甚至想用另一个具有相同接口的更好的库覆盖您的函数?

如果问题是关于要共享的库,并且可能与其他库发生命名空间冲突,您可以查看jQuery.noConflict