gpt4 book ai didi

javascript - JavaScript 中的 "defensive reference"是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:16:56 26 4
gpt4 key购买 nike

我在 d3 中找到了这个:

function d3_dispatch_event(dispatch) {
var listeners = [],
listenerByName = new d3_Map;

function event() {
var z = listeners, // defensive reference
i = -1,
n = z.length,
l;
while (++i < n) if (l = z[i].on) l.apply(this, arguments);
return dispatch;
}

event.on = function(name, listener) {
...

Link to a line on github

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

最佳答案

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

例如,假设有 2 个监听器正在监听事件 x。事件 x 被触发,系统开始从 index 0index 1 循环监听。 index 0 处的监听器首先被触发。回调被调用,该回调恰好删除了 index 1 处的监听器。循环将继续并尝试在 index 1 触发回调。监听器不存在,发生异常。

这是一个真正的简化示例,说明在循环时更改监听器列表时可能出现的问题。通过在循环之前计算监听器的数量,可以轻松处理列表的添加。在循环时处理删除操作要复杂得多。

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

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

原始的监听器数组没有改变,所以循环可以工作,但是对原始数组的引用丢失了。这就是 event 函数创建对它的本地引用的原因。通过 defensive reference 作者可能意味着创建对 listeners 的当前(循环前)值的临时引用,即使 listeners 的值在某些情况下发生更改,该值仍然存在循环点。

关于javascript - JavaScript 中的 "defensive reference"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26820348/

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