Javascript 为什么要使用名称空间并用“污染”来污染代码;这";

Javascript 为什么要使用名称空间并用“污染”来污染代码;这";,javascript,closures,Javascript,Closures,我有一个大型JavaScript项目,正在考虑将其封装在名称空间中以避免全局范围。据我所知,最好不要污染全球范围。当尝试这样做时,我的代码到处都是“this”。当我可以确保我的全局变量有唯一的名称时,我为什么要这样做 $m.Timers.Layer = { chunk: 3, c: null, total: null, update: function() { this.c = 0; this.total = $m.db.lengt

我有一个大型JavaScript项目,正在考虑将其封装在名称空间中以避免全局范围。据我所知,最好不要污染全球范围。当尝试这样做时,我的代码到处都是“this”。当我可以确保我的全局变量有唯一的名称时,我为什么要这样做

$m.Timers.Layer = {
    chunk: 3,
    c: null,
    total: null,
    update: function() {
        this.c = 0;
        this.total = $m.db.length;
        setTimeout(this.op1.bind(this), 0);
    },
    op1: function() {
        var end = this.c + this.chunk;
        if (end > this.total) { end = this.total }

        for (this.c; this.c < end; this.c++) {
            alert(this.c);
        }

        if (this.c != this.total) { setTimeout(this.op1.bind(this), 0) }
    }
};
$m.Timers.Layer={
区块:3,
c:空,
总计:空,
更新:函数(){
这个c=0;
this.total=$m.db.length;
setTimeout(this.op1.bind(this),0);
},
op1:函数(){
var end=this.c+this.chunk;
如果(end>this.total){end=this.total}
for(this.c;this.c
像“这样”很难理解,没有双关语的意思


编辑:此问题最初使用闭包一词,现已改为名称空间。

在您给出的示例中,使用
的目的是避免在任何地方都必须编写
$m.Timers.Layer

如果有人通过该属性调用分配给
$m.Timers.Layer.update
的函数,则在该调用中,
引用
$m.Timers.Layer
,因此
此.c
引用
$m.Timers.Layer.c

也许更重要的是,如果有人这样做:

var l = $m.Timers.Layer;
l.update(/*...*/);
…在调用中,
this
仍然指
$m.Timers.Layer
,因此
this.c
仍然指
$m.Timers.Layer.c


但是,请注意,闭包
这个
之间的关系很小。闭包的目的是关闭定义范围内的数据
实际上是函数调用中的参数。事实上,使用闭包来避免使用
this
(通过使用引用所需对象的变量)是相当常见的

进一步阅读(在我的博客上):

为避免这种情况,请沿管线使用封口

var $m = {Layer:{}};

(function(exports) {

    var c = null;
    var total = null;

    function update() {
        c = 0;
        total = db.length;
        ...
    }

    exports.update = update;
})($m.Layer);

在这个代码示例中,您没有任何闭包。“当我可以确保我的全局变量具有唯一的名称时”-然后您必须跟踪每个脚本(包括第三方脚本)中的变量名称,这很难。这段代码与闭包没有太多关系。这样写的目的是允许用户通过封装每个层的状态和与该状态一起工作的函数来创建彼此独立运行的多个层。。。i、 谷歌,openlayers,jquery…@Quentin:“你在代码示例中没有任何闭包。”他当然有。我数到二,对不起,我弄错了。我不完全理解闭包,我要找的正确单词是名称空间。Thanks@scuzzlebuzzle:从根本上说,答案不会改变(除了断点下方的位)。使用
是引用
$m.Timers.Layer
的一种简捷、更可靠的方法。