Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Почему колбек ведет себя по разному? (https://javascript.ru/forum/jquery/34039-pochemu-kolbek-vedet-sebya-po-raznomu.html)

Shitbox2 18.12.2012 19:20

Почему колбек ведет себя по разному?
 
function edit(id, callback) {
    $('button').click(callback(id)); //Запускается сразу
    $('button').click(function() {callback(id)}) //Запускается при щелчке
    $('button').click(function(id) {callback(id)}) //Запускается при щелчке, но callback возвращает ошибку из-за того, что вместо id передается null
}

Рабочий пример: http://jsfiddle.net/tamtakoe/WX7SB/

Объясните, почему так происходит? По мне, так все должно работать как второй вариант.

zebra 18.12.2012 19:50

Прочитайте про область видимости переменной. Измените аргумент id на другой.
$('button').click(function(event) {callback(id)})

Shitbox2 18.12.2012 20:50

Читал. Согласен, что не очень корректно использовать одно и то же название, но получается что у нас в разных областях видимости все-равно одна и та же переменная, как ни крути. Откуда только null берется, не пойму.

А по первому варианту? Почему $('button').click(callback(id)); срабатывает сразу, а не по клику?

zebra 18.12.2012 20:54

Конечно сразу. Смотрите пока не увидите в чем проблема. Она смешная.

Shitbox2 18.12.2012 21:03

И так час втупляю
function edit(id, callback) {
    $('button').click(callback(id));
}

edit('1', function(id){
    if (id === '1') {
        alert('OK');
    } else {
        alert('Err');
    }
})

callback — объект типа функция. Сам, по идее, запускаться не должен. Отдельно его нигде не запускаю...

Цитата:

Разницу чувствуешь?
Так у меня же var a = doSomething; нет?

Shitbox2 18.12.2012 21:14

Теперь ясно! Жаль что нельзя отдельно ссылку и параметры передать, не создавая безымянную функцию

Shitbox2 18.12.2012 21:41

А как правильнее данные передавать?
function edit(id, callback) {
    var self = this;
    $('button').click(function() { callback(self.id); });
}

function edit(id, callback) {
    $('button').click(function() { callback(id); });
}

function edit(id, callback) {
    $('button').click({'id':id}, function(e) { callback(e.data.id); });
}

Shitbox2 19.12.2012 11:26

Ага! В моем случае id это как раз $item.data.id


Часовой пояс GMT +3, время: 17:57.