Вход

Просмотр полной версии : Почему колбек ведет себя по разному?


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