gpt4 book ai didi

javascript - 为什么使用命名空间并用 "this"污染代码

转载 作者:行者123 更新时间:2023-12-02 18:25:27 28 4
gpt4 key购买 nike

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

像“这个”这样的词更难理解,没有双关语!

编辑:这个问题最初使用了“Closure”一词,现已更改为“命名空间”。

最佳答案

在您给出的示例中,使用 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(通过使用引用所需对象的变量来代替)是相当常见的。

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

关于javascript - 为什么使用命名空间并用 "this"污染代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18433809/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com