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

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

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

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

普通的函数声明function foo(){}是不会执行的。这里如果直接这样写function foo(){}()解释器会报错的,因为是错误的语法。 
IIFE函数的调用方式通常是将函数表达式、它的调用操作符、分组操作符放到一个括号内,来告诉解释器这里有一个需要立即执行的函数。否则通常情况下,解析器遇到一个function关键字,都会把它当做是一个函数声明,而不是函数表达式。 
如下几种写法都是可以的:

(function foo(){/*...*/}());(function foo(){/*...*/})();!function foo() {/*...*/}();+function foo() {/*...*/}();-function foo() {/*...*/}();~function foo() {/*...*/}();

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

void function(){/*...*/}();var foo = function(){/*...*/}(); true && function () { /*...*/ }();0, function () { /*...*/ }();

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

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

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

对于常见的(function($){...})(jQuery);即是将实参jQuery传入函数function($){},通过形参$接收。 
上述函数中,最开始的那个括号,可能会由于js中自动分号插入机制而引发问题。例如:

a  =  b  +  c
;(function  () { // code
}) ();

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

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

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

$( document ).ready(function() {console.log( "ready!" );
});   $(function() {console.log( "ready!" );
});

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

--------------------- 
作者:stpice 
来源:CSDN 
原文:https://blog.csdn.net/stpice/article/details/80586444

js中(function(){}()),(function(){})(),$(function(){});之间的区别相关推荐

  1. js中click 和onclick之间的区别

    1,onclick是绑定事件,告诉浏览器在鼠标点击时候要做什么 2,click本身是方法,作用是触发onclick事件,只要执行了元素的click()方法,就会触发onclick事件. 3,此外,正常 ...

  2. Jquery中.val()与.value之间的区别

    三年多没敲过代码了,今年打算捡起来,是需要多么大的勇气.但是为了实现自我价值,履行自我的承诺,这就是责任.没有什么难不难,晚不晚之说,是我经常对别人说的那样,再晚不过心晚,,一切努力了,实现了每一天的 ...

  3. -ms-flexbox_Flexbox中width和flex-basis之间的区别

    -ms-flexbox by Kyle Gallagher 凯尔·加拉格尔(Kyle Gallagher) Flexbox中width和flex-basis之间的区别 (The difference ...

  4. html offsetwidth 字符串宽度,基于js中style.width与offsetWidth的区别(详解)

    作为一个初学者,经常会遇到在获取某一元素的宽度(高度.top值...)时,到底是用 style.width还是offsetWidth的疑惑. 1. 当样式写在行内的时候,如 时,用 style.wid ...

  5. python观察日志(part20)--列表中加号,extend,append之间的区别

    学习笔记,仅供参考,有错必纠 列表中"+"加号,extend,append之间的区别 extend extend函数用于在列表末尾一次性追加另一个序列中的多个值. append a ...

  6. python __import__和import区别_Python中import 与__import__() 之间的区别比较

    本篇文章给大家带来的内容是关于Python中import 与__import__() 之间的区别比较,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 首先来说一下两者的区别: impo ...

  7. sql server序列_SQL Server中身份和序列之间的区别

    sql server序列 In SQL Server, both the SEQUENCE object and IDENTITY property are used to generate a se ...

  8. Oracle中用户和架构之间的区别?

    本文翻译自:Difference between a user and a schema in Oracle? Oracle中的用户和架构有什么区别? #1楼 参考:https://stackoom. ...

  9. C#中Int64和UInt64之间的区别

    Int64:此 Struct用于表示64位带符号整数.所述的Int64 可以两种类型的值,包括所述范围之间的负的和正的存储-9,223,372,036,854,775,808至9,223,372,03 ...

  10. c# int uint32_C#中Int32和UInt32之间的区别

    c# int uint32 C#Int32和C#UInt32 (C# Int32 and C# UInt32) In C#, Int32 known as a signed integer of 4 ...

最新文章

  1. 2018人工智能行业创新情报白皮书
  2. OSChina 周日乱弹 —— 冬季忧郁症五大特征
  3. 在Visual Studio中使用命令行参数进行调试
  4. 健身励志——肌肉不经锤炼不会增长
  5. oracle数据源的报表sql计算慢解决
  6. 钱趣多风控新举措:源头选择与物理隔离
  7. python中的sys模块和os_python中os与sys作用与区别
  8. python中输出菱形_用python打印菱形的实操方法和代码
  9. 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 Jtop
  10. 大神如何一招完美解决Hadoop集群无法正常关闭的问题!| 博文精选
  11. python中的bs4怎么导入_在Python 3.5导入BS4
  12. S-DES加密与解密
  13. _java等领域_测试、集成等领域最好的Java工具
  14. Android辅助服务禁用组件,每次调试运行时都禁用辅助功能服务
  15. Win10编译和测试libModbus
  16. 面对tomatserver使用的webrequest
  17. LeetCode #1088. Confusing Number II
  18. openwrt 3G上网功能配置(联通版本)
  19. RST 和 Markdown
  20. 全线路IC闭环控制自动温控电热毯维修记

热门文章

  1. 驾照考试:六百公里考试流程与注意事项
  2. MySQL 体系结构详细介绍
  3. shell+飞信实现网站监控
  4. java 使用webmagic 爬虫框架爬取博客园数据
  5. 上拉加载你这个坑货~
  6. nginx 同一个IP上配置多个HTTPS主机
  7. SQLServer性能优化之查询提示
  8. professional asp.net 4 with c# and VB.net 阅读笔记
  9. 每天在竞争中淘汰自己
  10. 番茄花园该打,反垄断更该升级