(function(){})(jQuery),function()中没有形参怎么接收jQuery

2021-07-22 17:10发布

jQuery中的
(function(){
//...
})(jQuery)
是执行匿名函数,但是function()的括号中为什么没有定义接收jQuery的形参

jQuery中的
(function(){
//...
})(jQuery)
是执行匿名函数,但是function()的括号中为什么没有定义接收jQuery的形参

5条回答


(function($){...})(jQuery)实际上是匿名函数,不懂得朋友可以继续往下看。 
这里实际上是匿名函数 function(arg){...} 这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写上括号和实参的,由于操作符的优先级,函数本身也需要用括号,即: (function(arg){...})(param) 这就相当于定义了一个参数为arg的匿名函数,并且将param作为参数来调用这个匿名函数 
而(function($){...})(jQuery)则是一样的,之所以只在形参使用$,是为了不与其他库冲突,所以实参用jQuery. 
等同于 var fn = function($){....}; fn(jQuery); 
(funtion(){})();立即执行函数;相当于先申明一个函数,声明完后直接调用; 
如果参数如: 
(funtion(str){alert(str)})("output"));相当于:funtion OutPutFun(str){alert(str);};OutPutFun("output");


我是大脸猫
3楼 · 2021-07-26 09:45

1. (function(){}())与(function(){})()

这两种写法,都是一种立即执行函数的写法,即IIFE (Immediately Invoked Function Expression)。这种函数在函数定义的地方就直接执行了。


通常的函数声明和调用分开的写法如下:


function foo() {/*...*/}     // 这是定义,Declaration;定义只是让解释器知道其存在,但是不会运行。


foo();                   // 这是语句,Statement;解释器遇到语句是会运行它的。

1

2

3

普通的函数声明function foo(){}是不会执行的。这里如果直接这样写function foo(){}()解释器会报错的,因为是错误的语法。

IIFE函数的调用方式通常是将函数表达式、它的调用操作符、分组操作符放到一个括号内,来告诉解释器这里有一个需要立即执行的函数。否则通常情况下,解析器遇到一个function关键字,都会把它当做是一个函数声明,而不是函数表达式。

如下几种写法都是可以的:


(function foo(){/*...*/}());


(function foo(){/*...*/})();


!function foo() {/*...*/}();


+function foo() {/*...*/}();


-function foo() {/*...*/}();


~function foo() {/*...*/}();

1

2

3

4

5

6

7

8

9

10

11

12

在需要表达式的场景下,就不需要用括号括起来了:


void function(){/*...*/}();


var foo = function(){/*...*/}(); 


true && function () { /*...*/ }();


0, function () { /*...*/ }();

1

2

3

4

5

6

7

void声明了不需要返回值,第二个则将IIFE函数的返回值赋给了foo。第三、第四个都是明确需要表达式的场景,所以解析器会认识这种写法。


对于IIFE函数,也可以给它们传入参数,例如:


(function foo(arg1,arg2,...){...}(param1,param2,...));

1

对于常见的(function($){...})(jQuery);即是将实参jQuery传入函数function($){},通过形参$接收。

上述函数中,最开始的那个括号,可能会由于js中自动分号插入机制而引发问题。例如:


a  =  b  +  c 

;(function  () { 

  // code 

})();

1

2

3

4

如果没有第二行的分号,那么该处有可能被解析为c()而开始执行。所以有的时候,可能会看到这样的写法:;(function foo(){/*...*/}()),前边的分号可以认为是防御型分号。


2. 第二类是$(function(){});

$(function(){/*...*/});是$(document).ready(function(){/*...*/})的简写形式,是在DOM加载完成后执行的回调函数,并且只会执行一次。


$( document ).ready(function() {

   console.log( "ready!" );

});   

1

2

3


$(function() {

   console.log( "ready!" );

});

1

2

3

起到的效果完全一样。


在一个页面中不同的js中写的$(function(){/*...*/});函数,会根据js的排列顺序依次执行。

例如:

test.html


 

 

 

 

    This page is shown to understand '$(document).ready()' in jQuery.
 

   

 

        If you see this line, it means DOM hierarchy has been loaded. NOW loading jQuery from server and execute JS...

 

   

 

    [removed][removed] 

    [removed][removed]

    [removed][removed]

 

1

2

3

4

5

6

7

8

9

10

11

12

13

test1.js


$(function(){

    $(document.body).append("$(document).ready()1 is now been executed!!!

"); 

});

1

2

3

test2.js


$(function(){

    $(document.body).append("$(document).ready()2 is now been executed!!!

"); 

});

1

2

3

最后可以看到页面输出如下:


This page is shown to understand '$(document).ready()' in jQuery. 

If you see this line, it means DOM hierarchy has been loaded. NOW loading jQuery from server and execute JS...


$(document).ready()1 is now been executed!!!


$(document).ready()2 is now been executed!!!



靓猴一枚
4楼 · 2021-07-27 10:47

(function($){...})(jQuery),这意味着定义并执行一个使用参数jQuery并通过形式参数$接收匿名函数的匿名函数。

分析:

1,匿名函数定义:javasript函数(arg){...},这种形式在javascript中称为匿名函数。 Arg是匿名函数的参数。

2,匿名函数调用:调用函数时,括号和参数写在函数之后。由于运算符的优先级,函数本身需要使用括号,即:(function(arg){...})(Param)这等效于使用参数arg定义匿名函数并使用param调用此匿名函数作为参数。

3,(function($){...})(jQuery)是使用实际参数jQuery定义和执行匿名函数,原因是在正式参数中使用$,以免与其他库冲突,因此实际参数使用jQuery。

4,等效形式:var fn = function($){....}; fn(jQuery);实际上,这是可以理解的,但是应该注意,fn不存在,直接定义函数,然后运行。只需“压缩”为以下(function($){...})(jQuery)。


首先,这个问题太专业了,没分清是Java还是web或者是Python的;

百度了一下,也觉得不合适,但是我还是要在这里作答一下,刷个流量;

毕竟任务就差这一条量了,感谢理解。

相关问题推荐

  • 回答 120

    相对前几年来说,要高上不少了,毕竟入行的人也是越来越多了,基础的工作对应想要参与的人群基数越来越大,但是对于高端人才的需求还是很多,人才还是相对稀缺性的。所以,想要学web或者其他技术也一样,别等,别观望。web前端就业方向特别多包括web前端开发...

  • 回答 25

    相对定位和绝对定位是定位的两种表现形式,区别如下:一、主体不同1、相对定位:是设置为相对定位的元素框会偏移某个距离。2、绝对定位:absolute 脱离文档流,通过 top,bottom,left,right 定位。二、特点不同1、相对定位:在使用相对定位时,无论是否进行移...

  • 抓包是什么意思?2020-04-01 17:36
    回答 7
    已采纳

    抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。抓包可以通过抓包工具来查看网络数据包内容。通过对抓获的数据包进行分析,可以得到有用的信息。目前流行的...

  • 回答 89

    常用的前端框架有Bootstrap框架、React框架、Vue框架、Angular框架、Foundation框架等等

  • 回答 65
    已采纳

    前端是目的就业前景非常不错的一个计算机技术,但是自学的话还是有一定难度的,网络上自学是碎片化的,同时互联网技术跟新换代快,自己的话比较吃力也学习不到最新的技术。

  • SSR 是什么意思?2020-03-20 18:56
    回答 6

    SSR就是一台服务器,可以利用 SSR 在远程的服务器上配置 SSR,使其能够成为 SSR 节点,这样本地电脑或者其它设备利用 SSR 节点实现 VPN 或者远程上网及游戏加速等方面。ShadowsocksR(简称 SSR)是 Shadowsocks 分支,在 Shadowsocks 的基础上增加了一些数据...

  • 回答 52
    已采纳

    计算机培训方向比较多,建议找适合自己的方向选择培训编程类:JAVA、WEB、Python、C/C++、C#等测试类:软件测试运维类:云计算、网络安全设计类:UI设计、3D建模等

  • 回答 11

    1、代码判断xAxis: {type: 'time',splitLine: {show: false},interval: 3600, // 设置x轴时间间隔axisLabel: {formatter: function(value, index) {return liangTools.unix2hm(value)}}},首先要把xAxis 显示类型设置成time,然后设置对应X轴......

  • 回答 8

    HTML5 + CSS + JavaScript 开发 跨平台重用代码 

  • 回答 4

    采用rem单位自动响应,并提供独有栅格化系统快速定义宽高、边距节省css代码量,同时总结各大型移动端网页,提供一套ui颜色搭配规范,尺寸规范,字体规范等。

  • 回答 10

    iView UI、ioni、SUI

  • 回答 6

     jQTouch 

  • 回答 4

    如果只是普通的移动端用vue react 或者dva 如果是要编译成小程序什么的或者混生 就用uni-app(对应vue语法)taro(对应react) 或者纯原生 这个没有限制的,自己怎么舒服怎么来

  • 回答 4

    因为可以运用在网页和小程序的开饭中,而且开源,用着便宜,企业都很喜欢

  • 回答 10

    一、Visual Studio Code下载地址:https://code.visualstudio.com/微软在2015年4月30日Build 开发者大会上正式宣布了 Visual Studio Code 项目:一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。Visual Stud...

  • 回答 9

    jQuery自带淡入淡出效果 https://www.w3school.com.cn/jquery/jquery_fade.asp 看看这个 

没有解决我的问题,去提问