提问者:小点点

如何在回调函数中使用delete运算符(理解问题)


我有个关于delete运算符的问题。

在将属性设置为NULL之前删除属性的第一个选项是否危险?

对不起,这真的只是一个理解性的问题,如果有人能给我解释一下,我会很高兴的。

备选案文1:

var requestPool = context.get('requestPool');

requestPool.pool[id].to = setTimeout(function() { 
    delete requestPool.pool[id];
}, msg.modbusJob.timeout);

备选方案2:

requestPool.pool[id].to = setTimeout(function() { 
    requestPool.pool[id].to = null;
    if(requestPool.pool[id]) {
        delete requestPool.pool[id];
    }
}, msg.modbusJob.timeout);

共2个答案

匿名用户

在将属性设置为NULL之前删除属性的第一个选项是否危险?

我会这样写:

setTimeout(function() { 
    if(requestPool && requestPool.pool && requestPool.pool[id]) {
        delete requestPool.pool[id];
    }
}, msg.modbusJob.timeout);

或者使用更现代的语法:

setTimeout(() => { 
    if(requestPool?.pool && requestPool.pool[id]) {
        delete requestPool.pool[id];
    }
}, msg.modbusJob.timeout);

匿名用户

在将属性设置为NULL之前删除属性的第一个选项是否危险?

在将属性设置为null之前,对其使用delete是安全的,但这也是不必要的。我猜(但我可能是错的)你正在尝试确保前一个项目是垃圾收集的。如果是这样,您也不需要delete它。其中任何一个都将使前一项成为垃圾可回收项(假设某个地方没有其他代码段保持对它的引用)。