0

我有一个大型 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) }
    }
};

像“这个”这样理解起来要困难得多,没有双关语的意思!

编辑:这个问题最初使用了闭包这个词,并已更改为命名空间。

4

2 回答 2

2

在您给出的示例中,使用的目的this是避免$m.Timers.Layer到处都写。

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

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

var l = $m.Timers.Layer;
l.update(/*...*/);

...在通话中,this仍然指的是$m.Timers.Layer,所以this.c 仍然指的是$m.Timers.Layer.c


但请注意,闭包this彼此几乎没有关系。闭包的目的是关闭定义范围内的数据。this实际上是函数调用中的参数。事实上,使用闭包来避免使用是相当普遍的this(通过使用引用所需对象的变量来代替)。

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

于 2013-08-25T21:23:54.187 回答
0

为避免这种情况,请使用闭包

var $m = {Layer:{}};

(function(exports) {

    var c = null;
    var total = null;

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

    exports.update = update;
})($m.Layer);
于 2013-08-25T21:47:32.063 回答