2013-02-21 4 views
-3

В приведенном ниже примере myFonk вызывается мгновенно; он не ждет события щелчка. Почему нет?Выполнение функции JavaScript слишком рано

function myFonk(info) { 
     $("#result").html(info); 
    } 

    function getText(text) { 
     return function() { 
      myFonk(text); 
     } 
    } 

    $(document).ready(function() { 
     $("#b1").click(getText("getText")); 
     $("#b2").click(myFonk("myFonk")); 
    }); 
+2

Плохо отформатированный фрагмент кода с вопросом в заголовке? В общем, мы предпочитаем немного больше усилий, заданных здесь. – halfer

ответ

5

Всякий раз, когда мы пишем имя функции с() вызывается функция, которая мгновенно следовательно myFonk("myFonk") не правильный путь ..

Написать в следующий способ.

function myFonk(info) { 
    $("#result").html(info); 
} 

function getText(text) { 
    return function() { 
     myFonk(text); 
    } 
} 

$(document).ready(function() { 
    $("#b1").click(getText("getText")); 
    $("#b2").click(function() { 
     myFonk("myFonk") 
    }); 
}); 
+1

Вкратце добавьте функцию обратного вызова, а затем запишите свой код. Использовать функцию() {}; и напишите свой код. –

+0

Теперь я понимаю, спасибо за помощь. – soztrk

+0

Добро пожаловать. Пожалуйста, отметьте как правильный ответ, если у вас есть правильный вывод. –

1

Это потому, что вы не передаете ссылку на функции. Вы вызываете функции и используете результаты в качестве обработчиков событий для click.

Это зафиксирует, что для вас ...

function myFonk(info) { 
    $("#result").html(info); 
} 

function getText(text){ 
    return function() { 
     myFonk(text); 
    } 
} 

$(document).ready(function() { 
    $("#b1").click(function() { 
     getText("getText") 
    }); 
    $("#b2").click(function() { 
     myFonk("myFonk") 
    }); 
}); 
+3

Это будет работать, но это не объясняет, что происходит на самом деле. – TRiG

+0

Я не закончил его редактирование :) – Archer

1
$(document).ready(function() { 
    $("#b1").click(getText("getText")); 
}); 

Что вы делаете здесь вызов функции getText("getText") и передавая результат этого вызова $("#b1").click(). Вы не хотите передавать результат функции. Что вы хотите сделать, так это передать эту функцию. Так переписать так,

$(document).ready(function() { 
    $("#b1").click(function() { 
     return getText("getText"); 
    }); 
}); 

Если функция, которую вы были заинтересованы в были без параметров (скажем, например, что вы хотите, чтобы вызвать функцию hello(), без параметров, вы могли бы сделать это таким же образом:

$(document).ready(function() { 
    $("#b1").click(function() { 
     return hello(); 
    }); 
}); 

... или вы могли бы упростить:

$(document).ready(function() { 
    $("#b1").click(hello); 
}); 

Примечание: вы передаете hello (сама функция), не hello() (которые выполняют бы функцию немедленно и вернуть результат функции click().

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