为什么我需要将JQuery代码包装在函数文字中?

时间:2012-08-30 17:29:14

标签: javascript jquery

我有以下代码 -

$(function(){
    $('#testbutton').click(function(){
        var checkedValue = $('[name="someRadioGroup"]:radio:checked').val();
        $('#result').html('The radio element with value <tt>' + checkedValue + '</tt> is checked');
    });
});

我理解$('#testbutton')使用id testbutton获取HTML元素并为其分配一个事件处理程序。

但我不明白为什么我需要将该代码放在函数文字中?

如果我删除$(function(){(以及相应的});),则无效。

但是,其他代码可以在不包含在函数文字中的情况下工作。示例 -  alert('Hi there')

有什么区别?为什么警报工作但事件赋值语句没有?

3 个答案:

答案 0 :(得分:6)

$(function(){...});$(document).ready(function(){...});的简写。它的目的是在您打算使用的元素存在于DOM中之前不运行代码(通常在文档准备好之后)。

答案 1 :(得分:2)

这不是必需的。

您将代码放在DOM准备就绪时调用的事件处理程序中。

如果您没有将代码放在DOM就绪处理程序中,并且您的代码执行DOM选择,则需要找到其他方法来确保DOM在运行之前就绪。

如果您的代码没有执行DOM选择,则不需要它。这就是你的alert()有效的原因,因为它不需要获取任何元素。

另一种选择就是这样。

<body>
   <button id="testbutton">click</button>
   <div id="result"></div>

   <script type="text/javascript" src="/your/script.js"></script>
</body>

这会将您的代码置于页面上的所有元素下方,因此在代码运行时它们肯定可用。

另一种方法是使用window.onload处理程序。

window.onload = function() {
    // your code
};

或使用jQuery。

$(window).on("load", function() {
    // your code
});

这类似于DOM就绪处理程序,除了它等待加载所有资源(如图像)。

答案 2 :(得分:0)

在最基本的层面上,(function(){...})()形式的东西是一个立即执行的函数文字。这意味着您已经定义了一个函数,并且您正在立即调用它。

此表单对于信息隐藏和封装非常有用,因为您在该函数中定义的任何内容都保留在该函数的本地,并且无法从外部世界访问(除非您专门公开它 - 通常通过返回的对象文字)。

这个基本形式的变体就是你在jQuery插件中看到的(或者通常在这个模块模式中)。由于您要定义函数文字,除非您明确传入信息,否则它无法访问来自外部世界的任何内容。因此:

(function($) {
  ...
})(jQuery);

这意味着你传递了对实际jQuery对象的引用,但它在函数文字范围内被称为$。