使用$(document).ready时为什么必须使用匿名函数?

时间:2012-05-19 22:38:13

标签: javascript jquery

我一直在使用文档,但我正在观看一些教程视频,真正知道最新情况,而不仅仅是通过输入这么多知道。

我总是把它放在一个匿名函数中,因为它总是这样做,但现在我看到它是否在匿名函数中(比如说alert();),它会在执行时执行NOT DOM加载但是当javascript加载时立即加载。它必须在一个匿名函数中才能实现它应该如何(当整个页面加载时)和事件监听器触发它的'ready'。

为什么会这样?

此外,我经常看到类似函数(i){}(i)的内容,这是什么意思?

3 个答案:

答案 0 :(得分:5)

在这个答案中,我将使用$(document).ready(...)的简写,$(...),只要传递了一个函数

该功能不必是匿名的;你可以这样写:

function doStuff() {
}

$(doStuff);

我认为你的意思是如果你试试这个:

$(alert('Yo!'));

它确实会立即提醒。这是因为需要一个函数,而alert()是函数调用。另一方面,这可以起作用(虽然很奇怪):

$(alert);

对于第二个问题,function(i){}(i)所做的是使用一个参数声明一个函数对象,然后立即使用提供的参数运行它。这是一种使用对象的有用方法,不需要它是全局的,也不需要具有某个名称。例如,这个:

(function($) {
    // Do stuff with $
})(jQuery);

允许您将jQuery别名为$

答案 1 :(得分:3)

嗯,这就是JavaScript的工作方式:

$(document).ready(alert('x'));会执行alert('x')并将其返回值传递给$(document).ready()。这显然毫无意义 - 您希望在DOM准备好时执行代码。因此,您将包含该代码的函数传递给$(document).ready() - 并且只要DOM准备好,jQuery就会执行传递给该函数的所有函数。

(function(i){})(i);是一种在新范围内创建新变量的方法。当你在循环中创建回调并且想要循环变量的当前值时,这是必要的。

如果你在谈论匿名函数,它有时会在你的问题的第一部分包含jQuery代码,即(function($){ /* code here *= })(jQuery); - 这用于允许$被使用,即使它不是指向全局范围内的jQuery。它类似于我在前一段中提到的,仅用于不同的目的。

答案 2 :(得分:1)

当你这样做时

$(alert())

相当于

var alertresult = alert()
$(alertresult);

在这种情况下,很明显警报立即运行。如果你想传递函数本身,你需要避免调用它:

$(alert)

至于function(i){ dosomething }(somevalue)的东西,它基本上是一个版本的

(function(){
    var i = somevalue;
    dosomething;
}());

也就是说,你可以在dosomething位中使用变量“i”。在紧接着调用的函数中包装代码的原因是,这使i变量成为只能在函数上访问的局部变量,这样它就不会与其他全局变量冲突,也不会被其他函数覆盖。