2013-06-22 6 views
2

Лучше ли переходить в функцию к другой функции, которая использует ее для уменьшения видимости области. Я довольно запутался в этом.Передача функции другой функции?

Без пропуска;

function loadSuccess(a, b, c) { 

}; 

function image(url, name, info) { 

    var asset = new Image(); 
    asset.addEventListener("load", function(name, info) { 
     return function() { 
      loadSuccess(this, name, info); 
     }; 
    }(name, info), false); 
    asset.src = url; 
}; 

image(a, b, c); 

И передать его;

function loadSuccess(a, b, c) { 

}; 

function image(url, name, info, loadSuccess) { 

    var asset = new Image(); 
    asset.addEventListener("load", function(name, info, func) { 
     return function() { 
      func(this, name, info); 
     }; 
    }(name, info, loadSuccess), false); 
    asset.src = url; 
}; 

image(a, b, c, loadSuccess); 

ответ

3

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

Однако, я вижу проблему в вашем коде: tt не имеет смысла возвращать что-либо из асинхронного обратного вызова. Это не ваша функция image, которая будет ее возвращать, а внутренняя анонимная функция, которую вы передали addEventListener.

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

function loadSuccess(a, b, c) { 

}; 

function image(url, name, info, func) { 
    var asset = new Image(); 
    asset.addEventListener("load", function(e) { 
     func(this, name, info); 
    }, false); 
    asset.src = url; 
}; 

image(a, b, c, loadSuccess); 

Я также удалил сразу вызывается функция была ранее, так как я не вижу особых оснований использовать его там.

+0

'function (...) {...} (...)' должен быть заключен в круглые скобки, так что разработчики знают, что это IIFE, а не обратный вызов. –

+0

Я даже не заметил IIFE (что делает мою предыдущую ревизию неправильной). Исправлено. – bfavaretto

+0

Спасибо за это, у меня была анонимная функция возврата там, потому что я переписывал код, ранее он был в одном вызове функции в цикле for, поэтому мне пришлось поддерживать закрытие, чтобы имя и информация хранились там для каждая итерация цикла, спасибо, что заметила это, хотя я этого не делал! – user2251919

1

Оба прекрасно работают, но я считаю хорошей практикой отправить функцию обратного вызова в качестве аргумента.

+0

Прохладный, я знал, что оба они в порядке, но мне нравится кодировать стандартным способом, спасибо. – user2251919

0

Первый вариант - использовать, когда функция изображения всегда требует вызова этой функции loadSucces.

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

Существует также третий вариант, в котором четвертый параметр указывать необязательно:

function image(url, name, info, loadSuccessParameter) { 
    loadSuccessParameter= loadSuccessParameter || loadSuccess; 
    [...] 

} 

Таким образом, вы можете назвать это так: образ (а, б, в) или так: образ (а, б, , otherLoadSuccess);

Надеюсь, это поможет.

Смежные вопросы