2015-08-10 4 views
2

У меня есть массив функций x = [f1,f2,f3,f4], созданный пользователем, пользователь может удалить их позже в коде.Recognize functions by pointer in javascript

Так что мой вопрос в том, как пользователь может попросить удалить f3, например, если он не знает его положения?

Моя идея - иметь функцию под названием x.remove(f3), и мне нужно сравнить указатели аргумента и элементы массива, но как это сделать в JS?

+0

Пользователь должен каким-то образом сохранить оригинальные ссылки на функции в 'x'. В противном случае это невозможно, если вы не можете использовать объект вместо массива. – Teemu

+0

Сравнение функциональных ссылок отлично работает в js. Просто используйте 'f === g', чтобы увидеть, есть ли у вас ссылки на одну и ту же функцию. – mrmcgreg

+0

Если вы используете это для управления обработчиками событий, вам понадобится что-то [более сложное] (http://jsfiddle.net/16uvpxhb/), чем простой массив. – Teemu

ответ

0

Я хотел бы изменить массив в объект:

x = {"f1" : f1, "f2": f2, "f3": f3, "f4" : f4}; 

Таким образом, вы можете выбрать по имени.

delete x['f3']; 

Это основное. Я не знаю вашего приложения, но вы должны назначить id функции и прикрепить этот идентификатор к кнопке delete. Когда пользователь нажимает кнопку, он выполняет функцию удаления, удаляя функцию из объекта.

Другая возможность - это когда функции не являются анонимными и имеют имя: сохранить имя в виде строки. Функцию можно назвать так:

var x = ["f1", "f2", "f3", "f4"]; 
window[x[0]](); //which is window['f1']() = window.f1() 
+0

спасибо за ваш ответ, цель состоит в том, чтобы создать малыша из системы событий, где вы можете прослушивать событие и вызывать функцию, когда это событие срабатывает.Я могу добавить несколько функций для каждого события - это массив функций, которые я сохраняю, и теперь я пытаюсь подумать, как я могу отменить регистрацию определенной функции за событие, но сохранить остальные. в вашем решении с объектами ключ в объекте - это целая строка функции, не уверен, что это хорошая практика, и, конечно, я хочу поддерживать анонимные функции. – Er85

+0

Эти ключи должны быть просто строковыми. – Mouser

+0

Что произойдет, если моя функция анонимна? или событие, если у меня есть несколько таких? как я могу узнать его имя? считайте, что пользователь не знает, какие имена я даю своим функциям, поэтому он не может попросить удалить имя, которое я дал – Er85

2

Это не имеет ничего общего с функциями. Функции являются объектами и имеют идентичность, поэтому если у вас есть ссылка на функцию (которая имеет пользователя), вы можете найти его в массиве и удалить его оттуда:

function remove(arr, val) 
    var i = arr.indexOf(val); 
    if (i != -1) 
      arr.splice(i, 1); 
} 

Это работает для любого произвольного значения , а не только для функций. В вашем случае вы просто сделаете remove(x, f3).

0

Используйте оператор равенства сравнить ссылки

var f1 = function() { alert(1) }; 
var f2 = function() { alert(2) }; 
var f3 = function() { alert(3) }; 

var x = [f1, f2, f3]; 

var remove = window['f2']; //or f2 

for (var i = 0; i < x.length; i++) { 
    x[i](); // alerts 1..2..3  
    if (x[i] == remove) 
    x.splice(i, 1); 
} 

for (var i = 0; i < x.length; i++) { 
    // alerts 1..3 
    x[i](); 
} 
+0

. Вы должны либо «ломаться», когда вы нашли элемент, так что становится ясно, что вы удаляете только первый, или используйте 'i -', чтобы вы не пропускали никаких случаев – Bergi