jQuery - 函数在没有被告知的情况下运行,请指教

时间:2011-08-12 19:21:21

标签: jquery function

我正在用jQuery写一个心理学实验。我想编写一个函数,当用户按下p或q时将开始练习。我有那个工作:

$(function trial() {
$("body").keydown(function(e) {
    if (e.which == 81 || e.which == 80)
        {
        $(".message").text("exercise begun (timestamp)");
        var refreshId = setTimeout(timeout, 2000);
        }
});
});

但我对一件事感到困惑:这个函数,trial(),会自动运行。我想打电话给它,让它运行。 例如,这个功能

function timeout(x) {
var x = trialNum
$(".message").prepend("Timeout (Trial " + x + ")<br>");
}
通过trial()调用的

表现得很好,除非被调用,否则它不会运行。我认为这与$符号和“范围”有关?所有帮助表示赞赏。

哦!另外,还有一个问题。我试图制作一个递归的jQuery函数,并且遇到了很多麻烦。什么是使函数调用的最佳方法?

7 个答案:

答案 0 :(得分:10)

这是因为您将对它的引用传递给$()(又名jQuery()),这是ready函数的快捷方式,并在加载DOM时运行。


偏离主题:BTW,通过这样做,您将该功能用作右手值(就像在右侧的东西一样) =签名)。这使它成为函数表达式。由于您已将该函数命名为(good thing to do),因此它是名为的函数表达式。这些在历史上在各种JavaScript实现中都不能很好地工作。大多数当前的浏览器(现在)都可以,除了IE9之前的IE,它将创建两个完全独立的功能,更多信息在这里:Double take

答案 1 :(得分:3)

function trial() { ... }$();包围在一起,您就可以在文档准备就绪时调用它。这是$(document).ready(function trial() { ... }); [API Ref]

的简写

如果您不想这样做,请移除周围的$();

答案 2 :(得分:2)

要回答您的第一个问题,$(function(){...code...})$(document).ready(function(){...code...});的jQuery快捷方式,只要DOM达到ready状态就会运行。

关于你的第二个问题(它确实属于关于SO的单独问题,但无论如何我都会回答):

jQuery中的函数与JavaScript中的函数没有什么不同。命名函数可以使用自己的名称递归调用自己:

function foo(bar, baz)
{
  ...do some stuff...
  if (--bar)
  {
    foo(bar, baz);
  }
}

你必须更具体地说明你想用递归函数实现什么,如果你打算这样做,请在StackOverflow上打开一个单独的问题。

答案 3 :(得分:0)

trial()会自动运行,因为它位于$()函数内。 $(function(){})$(document).ready(function(){})相同。

$(function trial(){});在其范围内创建一个名为trial的函数,然后在DOM准备就绪时运行它。

只需正常声明该功能:

function trial(){
  // Code
}

或者,如果你想在DOM准备就绪时声明它,你可以在$()内声明它(注意:trial只存在于$()函数内):

$(function(){
    function trial(){
      // Code
    }
    trial();
});
trial(); // won't work, it's out of scope

答案 4 :(得分:0)

$()是DOM ready事件的捷径。它只是执行传递给它的函数。要解决此问题,请使用$(document).ready本身:

$(document).ready(function(){
   function trial() {
        $("body").keydown(function(e) {
        if (e.which == 81 || e.which == 80){
             $(".message").text("exercise begun (timestamp)");
             var refreshId = setTimeout(timeout, 2000);
        }
   }
});

答案 5 :(得分:0)

尝试以下方法:

$(function(){
trial = function(){
// Your code here
};
});

答案 6 :(得分:-1)

尝试这样做:$(function trial()会让它自动运行。

我不知道为什么会这样,但是jQuery就是这样做的。您可以将其保留为function trial()。至于重复该功能,只需将函数名称放在函数中并在外部调用函数,如下所示:

function trial() {
    $("body").keydown(function(e) {
        if (e.which == 81 || e.which == 80)
        {
            $(".message").text("exercise begun (timestamp)");
            var refreshId = setTimeout(timeout, 2000);
        }
    });
    trial();
}
trial();

但是,我不建议这样做,因为它会导致无效循环,导致标签崩溃。