Pull to refresh

Comments 28

Параметры можно передавать с помощью анонимных функций:

window.addEventListener('load', function() { test("param"); }, false);
На мой взгляд - это расточительно. ;)
А вы не подскажете, как оценить это расточительство ?
Начал писать ответ и сам запутался немного. Вечером у меня будет время я поставлю еще несколько экспериментов в реальных условиях и тогда отвечу.
onload можно. А вообще утечки не будет?
А удалять их потом как?
Спасибо, нужно будет попробовать под Оперу...
UFO just landed and posted this here
А про ООП можно поподробнее, дело в том, что я ООП и использую, но до сих пор изящного способа реализовать привычные мне EventArgs, используемые в других ОО-языках не встречал.
UFO just landed and posted this here
UFO just landed and posted this here
Это назвается "замыкания", а лямбда-функции - это немного другое.
Учите теорию.
Не спорьте горячие финские парни - это таки называется closures, а реализуются они с помощью лямбда-исчисления (кто такие "лямбда-функции" мне и самому интересно было бы узнать).
UFO just landed and posted this here
Не понял смысла этого действа.
Повесить несколько вызовов одной функции с разными параметрами не получится.
А если с одним и тем же, то почему просто не задать его жестко в самой функции?
Идея в том что это одно значение можно менять. Но действительно closures - лучшее решение...
А смысл его менять?
Всё равно нельзя с его помощью сделать два обработчика с разными параметрами.
Еще можно пользоваться apply (не факт що это оправдано но вроде работает практически везде (IE5+)):
function bindParameter(_func, _params)
{
return function()
{
_func.apply(this, _params)
};
}
То же самое замыкание
Замыкания (closures, delegates) – это одна из основных фишек JavaScript. Без нее реализация часто возможна только с использованием глобальных переменных, что на самом деле будет тем же самым замыканием, только не вокруг одной переменной, а вокруг всех переменных window. ;)

Для чего применяется:
- создать ссылку на вызов функции с параметрами (переданными при создании замыкания)
- создать ссылку на вызов функции в контексте объекта

Я использую вот такую функцию для создания замыканий:
/**
* Bind function to context
* @param {Object|HTMLElement} context
* @param {Function} fn
* @return {Function} function bound to context
*/
$.bind=function(context, fn /*args...*/)
{
    if(typeof(context)=='function'){
        var args=Array.prototype.slice.call(arguments,0)
        args.unshift(null);
        return $.bind.apply(this, args);
    }

    if(arguments.length==2){    // params on call
        return function(){
            fn.apply(context||null, arguments);
        };
    }else{    // params on create
        var args=Array.prototype.slice.call(arguments,2);
        return function(){
            fn.apply(context||null, args.concat(Array.prototype.slice.call(arguments,0)));
        };
    }
};

Столько всего наворочено только для удобства использования и оптимизации.

Самым простым вариантом будет такой:
/// delegate bound params on create, if none params on call
function delegate(that, thatMethod /*args...*/)
{
    if(arguments.length==2)
        /// params on call
        return function(){ return thatMethod.apply(that,arguments); };

    /// params on create
    var args=Array.prototype.slice.call(arguments,2);
    return function(){ return thatMethod.apply(that,args); };
}


На счет расточительства: как асемблерщик – асемблерщика я вас понимаю. Говорят, что из-за ООП программы на C++ медленнее программ на C в 10000 раз. Но ведь давно уже никто не говорит, что использовать ООП – расточительно. JavaScript сам по себе быстрый. Узкие места обычно кроются в его связке с DOM.
Расточительность - ворочать кучи непонятного кода, там где можно обойтись двумя элегантными строчками.
Кроме того, возможность оформления вызова функции с определенными параметрами в другой объект-функцию с возможностью передачи его дальше, это всего лишь один из многих и многих аспектов замыканий.
Еще стоит отметить следующие применения: псевдо-private члены класса, функции-генераторы.
что я еще забыл?
Скорее перечислить то, что к ним не относится.
Даже вызов функции, определенной вне этой функции осуществляется с помощью замыкания.
ну это я упоминал в первы строках моего коментария. Вопрос не в том, что замыкания неявно присутствуют везде, а в том, когда правильнее решать проблемы именно используя замыкания.
Sign up to leave a comment.

Articles