js中(function(){}()),(function(){})(),$(function(){});之间的区别
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(){});之间的区别相关推荐
- js中click 和onclick之间的区别
1,onclick是绑定事件,告诉浏览器在鼠标点击时候要做什么 2,click本身是方法,作用是触发onclick事件,只要执行了元素的click()方法,就会触发onclick事件. 3,此外,正常 ...
- Jquery中.val()与.value之间的区别
三年多没敲过代码了,今年打算捡起来,是需要多么大的勇气.但是为了实现自我价值,履行自我的承诺,这就是责任.没有什么难不难,晚不晚之说,是我经常对别人说的那样,再晚不过心晚,,一切努力了,实现了每一天的 ...
- -ms-flexbox_Flexbox中width和flex-basis之间的区别
-ms-flexbox by Kyle Gallagher 凯尔·加拉格尔(Kyle Gallagher) Flexbox中width和flex-basis之间的区别 (The difference ...
- html offsetwidth 字符串宽度,基于js中style.width与offsetWidth的区别(详解)
作为一个初学者,经常会遇到在获取某一元素的宽度(高度.top值...)时,到底是用 style.width还是offsetWidth的疑惑. 1. 当样式写在行内的时候,如 时,用 style.wid ...
- python观察日志(part20)--列表中加号,extend,append之间的区别
学习笔记,仅供参考,有错必纠 列表中"+"加号,extend,append之间的区别 extend extend函数用于在列表末尾一次性追加另一个序列中的多个值. append a ...
- python __import__和import区别_Python中import 与__import__() 之间的区别比较
本篇文章给大家带来的内容是关于Python中import 与__import__() 之间的区别比较,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 首先来说一下两者的区别: impo ...
- sql server序列_SQL Server中身份和序列之间的区别
sql server序列 In SQL Server, both the SEQUENCE object and IDENTITY property are used to generate a se ...
- Oracle中用户和架构之间的区别?
本文翻译自:Difference between a user and a schema in Oracle? Oracle中的用户和架构有什么区别? #1楼 参考:https://stackoom. ...
- C#中Int64和UInt64之间的区别
Int64:此 Struct用于表示64位带符号整数.所述的Int64 可以两种类型的值,包括所述范围之间的负的和正的存储-9,223,372,036,854,775,808至9,223,372,03 ...
- 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 ...
最新文章
- 2018人工智能行业创新情报白皮书
- OSChina 周日乱弹 —— 冬季忧郁症五大特征
- 在Visual Studio中使用命令行参数进行调试
- 健身励志——肌肉不经锤炼不会增长
- oracle数据源的报表sql计算慢解决
- 钱趣多风控新举措:源头选择与物理隔离
- python中的sys模块和os_python中os与sys作用与区别
- python中输出菱形_用python打印菱形的实操方法和代码
- 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 Jtop
- 大神如何一招完美解决Hadoop集群无法正常关闭的问题!| 博文精选
- python中的bs4怎么导入_在Python 3.5导入BS4
- S-DES加密与解密
- _java等领域_测试、集成等领域最好的Java工具
- Android辅助服务禁用组件,每次调试运行时都禁用辅助功能服务
- Win10编译和测试libModbus
- 面对tomatserver使用的webrequest
- LeetCode #1088. Confusing Number II
- openwrt 3G上网功能配置(联通版本)
- RST 和 Markdown
- 全线路IC闭环控制自动温控电热毯维修记