Javascript 从数组中删除函数

Javascript 从数组中删除函数,javascript,jquery,arrays,delegates,Javascript,Jquery,Arrays,Delegates,我有一个函数数组,我正试图像c#中的委托事件一样使用它 我将一个函数推送到数组中,当数组在函数上循环时,它将被调用 问题是,一旦我完成了这个函数,我就很难删除它,这会破坏它的用途 这是我的密码。我完全想用一种不同的方法来做这件事,我对JS/JQ还相当陌生,所以这就是我想到的 var mousemoveffunctions=[]; $(文档).ready(函数(){ //创建事件以调用我们的函数。 $(文档).mousemove(函数(e){ callmousemove函数(e); }); })

我有一个函数数组,我正试图像c#中的委托事件一样使用它

我将一个函数推送到数组中,当数组在函数上循环时,它将被调用

问题是,一旦我完成了这个函数,我就很难删除它,这会破坏它的用途

这是我的密码。我完全想用一种不同的方法来做这件事,我对JS/JQ还相当陌生,所以这就是我想到的

var mousemoveffunctions=[];
$(文档).ready(函数(){
//创建事件以调用我们的函数。
$(文档).mousemove(函数(e){
callmousemove函数(e);
});
});
函数CallMouseMoveFunctions(e){
//仅当阵列中至少有1个函数时才继续。
if(mousemoveffunctions.length==0)返回;
//调用数组中的每个函数。
for(var i=0;i}
您需要传递一个1作为第二个参数,告诉它在作为第一个参数提供的索引位置删除1个元素

.splice(index, 1)

您需要传递一个1作为第二个参数,以告诉它在作为第一个参数提供的索引位置删除1个元素

.splice(index, 1)
//总是出现-1,所以它不会被移除

您总是得到
-1
,因为您正在将一个唯一的函数对象传递给
.indexOf()
,所以它不可能已经在数组中。推送到数组中的匿名函数没有其他引用,因此无法通过引用将其删除

因为您正在推送和删除一个只传递事件参数的函数,所以可以改为推送函数本身

MouseMoveFunctions.push(TrackMouse);
如果您通过标识查找相同的函数,那么您将能够成功地找到它

var index = MouseMoveFunctions.indexOf(TrackMouse);
请注意,如果多次将同一函数放入数组中,则每次都需要单独删除它

另外,正如Scott所指出的,您需要提供要删除的项目数


更好的解决方案是使用
集合
而不是数组。此外,您还可以摆脱那些
.ready()
处理程序

var MouseMoveFunctions = new Set();

//Create the event to call our functions.
$(document).mousemove(CallMouseMoveFunctions);

function CallMouseMoveFunctions(e){  
    //Only continue if there is atleast 1 function in the array.
    if(MouseMoveFunctions.size == 0) return;

    //Call each function in the set.
    for(const fn of MouseMoveFunctions) {
        fn(e);
    }
}

//Add the TrackMouse function to the array.
MouseMoveFunctions.add(TrackMouse);

var mX = 0;
var mY = 0;

function TrackMouse(e){
     mX = e.pageX;
     mY = e.pageY;    

     MouseMoveFunctions.delete(TrackMouse);
}
//总是出现-1,所以它不会被移除

您总是得到
-1
,因为您正在将一个唯一的函数对象传递给
.indexOf()
,所以它不可能已经在数组中。推送到数组中的匿名函数没有其他引用,因此无法通过引用将其删除

因为您正在推送和删除一个只传递事件参数的函数,所以可以改为推送函数本身

MouseMoveFunctions.push(TrackMouse);
如果您通过标识查找相同的函数,那么您将能够成功地找到它

var index = MouseMoveFunctions.indexOf(TrackMouse);
请注意,如果多次将同一函数放入数组中,则每次都需要单独删除它

另外,正如Scott所指出的,您需要提供要删除的项目数


更好的解决方案是使用
集合
而不是数组。此外,您还可以摆脱那些
.ready()
处理程序

var MouseMoveFunctions = new Set();

//Create the event to call our functions.
$(document).mousemove(CallMouseMoveFunctions);

function CallMouseMoveFunctions(e){  
    //Only continue if there is atleast 1 function in the array.
    if(MouseMoveFunctions.size == 0) return;

    //Call each function in the set.
    for(const fn of MouseMoveFunctions) {
        fn(e);
    }
}

//Add the TrackMouse function to the array.
MouseMoveFunctions.add(TrackMouse);

var mX = 0;
var mY = 0;

function TrackMouse(e){
     mX = e.pageX;
     mY = e.pageY;    

     MouseMoveFunctions.delete(TrackMouse);
}

这太奇怪了,我之前试图自己传递函数,但它不起作用。我想是别的什么地方出了问题。我不知道有一套,它和c#list类似吗?谢谢你,皮特。这太奇怪了,我之前试图自己传递函数,但它不起作用。我想是别的什么地方出了问题。我不知道有一套,它和c#list类似吗?谢谢Pete。实际上这不是必需的,但是谢谢你的回复。@littlrain如果省略它,从索引到数组末尾的所有元素都将被删除,而不仅仅是索引处的元素。啊,好的,我想我使用它的方式没有受到影响。Thanksit实际上不是必需的,但感谢您的回复。@littlrain如果省略它,则从索引到数组末尾的所有元素都将被删除,而不仅仅是索引处的元素。啊,好的,我想我使用它的方式没有受到影响。谢谢