“什么是”呢;防御性参考“;用javascript?

“什么是”呢;防御性参考“;用javascript?,javascript,d3.js,Javascript,D3.js,我在d3中发现: 功能d3\u调度事件(调度){ var侦听器=[], listenerByName=新的d3_地图; 函数事件(){ var z=侦听器,//防御引用 i=-1, n=z.长度, L 而(++i

我在d3中发现:

功能d3\u调度事件(调度){
var侦听器=[],
listenerByName=新的d3_地图;
函数事件(){
var z=侦听器,//防御引用
i=-1,
n=z.长度,
L
而(++i


这里的“防御引用”是什么意思?

实现事件系统时的问题是正确地触发侦听器。在调用回调时更改侦听器列表可能会导致意外行为

例如,假设有两个侦听器正在侦听事件
x
。事件
x
被触发,系统开始将侦听器从
索引0
循环到
索引1
。索引0
处的侦听器首先被触发。回调被调用,该回调恰好在
索引1
处删除侦听器。loop wi我将继续,它将尝试在
索引1
处启动回调。侦听器不再存在,出现异常

这是一个简单的例子,说明了在循环时更改侦听器列表可能会出错。通过计算循环前侦听器的计数,可以轻松处理列表中的添加。在循环时处理删除操作要复杂得多

在d3中,侦听器列表中的每个删除操作都将导致创建新的侦听器数组,并将该数组作为变量
侦听器的值

listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));

侦听器的原始数组没有更改,因此循环将正常工作,但对原始数组的引用丢失。这就是为什么
event
函数会创建对它的本地引用。By
defective reference
author可能意味着创建对current的临时引用(在循环之前)
listeners
的值,即使在循环的某个点上更改了
listeners
的值,该值仍然有效。

它在JavaScript中没有任何意义。它只对该注释的作者有意义。@squint nice catch(#58行)。如果您要创建它,请让我接受您的答案,并删除此注释:)。对此我并不完全正确。该行似乎是用于删除的。虽然它可以确保删除项目仍然可以访问(我想这是他们想要的),但实际上执行了
.push()
进入
监听器
。但是,由于他们为
while
循环缓存了
.length
,添加的项目将无法到达。因此我想这只是为了删除,以便删除的处理程序仍会启动。继续并给出答案。我不确定我是否已经分析了所有角度,我需要回去工作!:-)