“什么是”呢;防御性参考“;用javascript?
我在d3中发现:“什么是”呢;防御性参考“;用javascript?,javascript,d3.js,Javascript,D3.js,我在d3中发现: 功能d3\u调度事件(调度){ var侦听器=[], listenerByName=新的d3_地图; 函数事件(){ var z=侦听器,//防御引用 i=-1, n=z.长度, L 而(++i
功能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
函数会创建对它的本地引用。Bydefective reference
author可能意味着创建对current的临时引用(在循环之前)listeners
的值,即使在循环的某个点上更改了listeners
的值,该值仍然有效。它在JavaScript中没有任何意义。它只对该注释的作者有意义。@squint nice catch(#58行)。如果您要创建它,请让我接受您的答案,并删除此注释:)。对此我并不完全正确。该行似乎是用于删除的。虽然它可以确保删除项目仍然可以访问(我想这是他们想要的),但实际上执行了.push()
进入监听器
。但是,由于他们为while
循环缓存了.length
,添加的项目将无法到达。因此我想这只是为了删除,以便删除的处理程序仍会启动。继续并给出答案。我不确定我是否已经分析了所有角度,我需要回去工作!:-)