Передача параметров в функцию обратного вызова - PullRequest
0 голосов
/ 02 марта 2012

У меня есть функция, которая прослушивает щелчок по экрану и запускает обратный вызов.Он является частью объекта Helper (поэтому в моем примере кода ему предшествует термин Helper. Это не имеет значения.

var Helper = { 
    bodyClickListener: function(fn) {
        var window = document.getElementsByTagName('body')[0];
        window.click();
        CORE.dom.on(window, 'click', function(event) {
            CORE.dom.off(window, 'click');
            fn(event);
        });
    }
}

Мне нужно передать функцию в эту функцию с помощьюпараметр, который был ранее установлен.

function someFunction() {    
    var popup = document.getElementById('tagResultsPopup');
    Helper.bodyClickListener(function(popup) {
        return function(event) {
            event.stopPropagation();
            removePopup(popup);
        };              
    }(document.getElementById('tagResultsPopup')));

    function removePopup(element) {
        if(element) {
            element.parentNode.removeChild(element);
        }
    };
}

Приведенный выше код работает, но вы заметите, что мне нужно установить переменную popup внутри функции обратного вызова. Она уже была установлена ​​выше.передать ссылку на предыдущую переменную в функцию обратного вызова.

Ответы [ 3 ]

0 голосов
/ 02 марта 2012

Функция, которую вы передаете bodyClickListener, является закрытием.Вы можете просто ссылаться на 'popup' внутри этой функции без каких-либо проблем.Вам не нужно создавать новую переменную.

0 голосов
/ 02 марта 2012

Ответ заключался в использовании замыкания следующим образом:

Helper.bodyClickListener(function(popup) {
    return function(event) {
        event.stopPropagation();
        removePopup(popup);
    };              
}(document.getElementById('tagResultsPopup')));

Таким образом, функция обратного вызова имеет доступ к переменной, которую я передаю в функцию параметра.Итак, здесь возвращение - это фактически функция, которую я передаю в качестве обратного вызова.

0 голосов
/ 02 марта 2012

Если я правильно понимаю ваш вопрос, вам не нужно много делать.Вы можете просто использовать переменную popup, определенную снаружи.

var popup = document.getElementById('tagResultsPopup');
Helper.bodyClickListener(function(event) {
    event.stopPropagation();
    //Don't set it  
    //var popup = document.getElementById('tagResultsPopup');
    removePopup(popup);//popup will refer to the correct variable
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...