zoukankan      html  css  js  c++  java
  • Jquery中的(function($){...})(jQuery)

    当你第一眼看到“(function($){...})(jQuery)”的时候,你有什么感觉?呵呵呵,我当时还是止不住的从心底里骂了一句——操,这他妈什么劳什子。时过境迁,对于现在无比倚重Jquery的我,自感当时的自己是那么的无知,今天忙里偷闲,解释一下究竟“(function($){...})(jQuery)”该怎样理解:

    代码一:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <title>代码一</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script type="text/javascript">
        (function(name){
            alert(name);
        })("GaoHuanjie");
    </script>

    说明:在浏览器中运行上面代码,会弹出一个对话框,对话框的内容为GaoHuanjie。

    上面代码中执行的JavaScript脚本和“(function($){...})(jQuery)”是一样的,也就是说“(function($){...})(jQuery)”中的函数会自动被执行,那么究竟该怎样理解“(function($){...})(jQuery)”呢?“(function($){...})(jQuery)”实际上表示的是已处于调用状态的匿名函数:function($){...}是定义的匿名函数,参数为$(之所以将参数声明为$是为了不与其他库冲突);为了调用该函数则在该匿名函数的后面添上了括号和实参(这里为jQuery),但又由于操作符的优先级,函数本身也需要用括号,所以又为匿名函数添加了括号。
    释疑解惑:

    一、我运行下面代码为什么报错——jQuery is not defined:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <title>代码二</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script type="text/javascript">
        (function($){
            alert($);
        })(jQuery);
    </script>

    嗯嗯,浏览器在解析上述js脚本时确实会出现问题,假如为jQuery添加英文双引号,再次使用浏览器运行上述脚本则不会出错,为什么不加就会出错呢,呵呵呵,其实这里的jQuery还是一个变量,如果为上述代码引入jQuery库,再次使用浏览器运行上述代码则不会出现问题:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <title>代码三</title>
    <script type="text/javascript" src="./jquery-1.6.2.js"></script>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script type="text/javascript">
        (function($){
            alert($);
        })(jQuery);
    </script>

    在引入jQuery库后之所以不会出错是因为jQuery库中定义了jQuery变量。

    二、和$(function(){ })相比,(function($){...})(jQuery)的执行时机也是在网页DOM加载完毕后才执行吗?

    不是的,比如如下例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <title>代码四</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script type="text/javascript">
        (function(){
            alert(document.getElementById("name").value);
        })();
    </script>
     
     
    <input type="hidden" id="name" name="name" value="GaoHuanjie">

    上述例子在浏览器中运行的时候会报错,究其原因(function(){...})()函数的执行时机并不是在DOM加载完毕后才执行,而是随着页面自上而下来执行,如果将其改成如下代码则再次使用浏览器运行脚本则不会出现问题:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <html>
         
            <title>代码五</title>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
         
         
            <input type="hidden" id="name" name="name" value="GaoHuanjie">
            <script type="text/javascript">
                (function(){
                    alert(document.getElementById("name").value);
                })();
            </script>
        

    一句话:“$(function(){ });”用于存放操作DOM对象的代码,执行其中代码时DOM对象已存在;“(function(){})(jQuery);”用于存放开发插件的代码,执行其中代码时DOM不一定存在。

  • 相关阅读:
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 88怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 81.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 40怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 24.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 21.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器试运行提示过速度保护怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器如何执行绝对值清零
    倍福TwinCAT(贝福Beckhoff)基础教程 松下绝对值驱动器如何做初始化设置
    倍福TwinCAT(贝福Beckhoff)基础教程 松下官方软件开启报错伺服未就绪怎么办
    JAVA Eclipse 启动 Eclipse 弹出“Failed to load the JNI shared library jvm_dll”怎么办
  • 原文地址:https://www.cnblogs.com/jayden-en/p/5131760.html
Copyright © 2011-2022 走看看