函数声明:function fnName () {…};
函数表达式 var fnName = function () {…};
匿名函数:function () {};

fnName();
function fnName(){alert(12); }//正常,函数声明调用前就已存在,所以函数调用可在函数声明之前 fnName(); var fnName=function(){ alert(123); }//报错,函数表达式,属于按顺序执行,变量fnName还未保存对函数的引用,所以函数调用必须在函数表达式之后 var fnName=function(){ alert(1234); }();//函数表达式后面加括号,当javascript引擎解析到此处时能立即调用函数 function fnName(){ alert(12345); }();//不会报错,但是javascript引擎只解析函数声明,忽略后面的括号,函数声明不会被调用 function(){ console.log(123456); }();//语法错误,虽然匿名函数属于函数表达式,但是未进行赋值操作, //所以javascript引擎将开头的function关键字当做函数声明,报错:要求需要一个函数名

( function(){…} )()和( function (){…} () )是两种立即执行函数

这3种写法等效:
var client = function() { alert("Chrome");}(); 
var client = (function() { alert("Chrome");}());
var client = (function() { alert("Chrome");})();

立即执行的其他写法:

(function(a,b){console.log(a,b);   //控制台输出123,使用()运算符 })(123,456); (function(a){ console.log(a); //控制台输出1234,使用()运算符 }(1234)); !function(a){ console.log(a); //控制台输出12345,使用!运算符 }(12345); +function(a){ console.log(a); //控制台输出123456,使用+运算符 }(123456); -function(a){ console.log(a); //控制台输出1234567,使用-运算符 }(1234567); var fn=function(a){ console.log(a); //控制台输出12345678,使用=运算符 }(12345678)

在function前面加!、+、 -甚至是逗号等到都可以起到函数定义后立即执行的效果,而()、!、+、-、=等运算符,都将函数声明转换成函数表达式,消除了javascript引擎识别函数表达式和函数声明的歧义,告诉javascript引擎这是一个函数表达式,不是函数声明,可以在后面加括号,并立即执行函数的代码。 

加括号是最安全的做法,因为!、+、-等运算符还会和函数的返回值进行运算,有时造成不必要的麻烦。 

这样写的作用: javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间” 

JQuery使用的就是这种方法,将JQuery代码包裹在( function (window,undefined){…jquery代码…} (window)中,在全局作用域中调用JQuery代码时,可以达到保护JQuery内部变量的作用。 

转载于:https://www.cnblogs.com/pbblogs/p/9525692.html

( function(){…} )()和( function (){…} () )是两种立即执行函数相关推荐

  1. NLP:两种方法(自定义函数和封装函数)实现提取两人对话内容(***分隔txt文档),并各自保存为txt文档

    NLP:两种方法(自定义函数和封装函数)实现提取两人对话内容(***分隔txt文档),并各自保存为txt文档 目录 问题探究 实现代码 问题探究 实现代码 f=open("niu.txt&q ...

  2. JS定义函数的两种方式:函数声明和函数表达式

    函数声明 关于函数声明的方式,它的一个重要的特性就是函数声明提升(function declaration hoisting),意思是在执行代码之前会先读取函数声明.这就意味着可以把函数声明放在调用它 ...

  3. Python基础day05【函数(函数传参的两种形式、函数形参)、拆包、引用、可变与不可变类型、引用做函数参数注意点】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员]    目录 0.复习 1.函数传参的两种形式[掌握] 2.函数形参 2.1.缺省参数(默认参数) ...

  4. spring boot初始化完成时(两种方式)执行某种操作

    第一种: 实现接口ApplicationListener,并重写public void onApplicationEvent(ApplicationEvent event) {}可以在容器初始话的时候 ...

  5. bpmn文件的标签为何都以bpmn2开头_C语言之两种作用域:函数的作用域与文件作用域...

    作用域描述程序中可访问标识符的区域.一个C变量的作用域可以是块作用域.函数作用域.函数原型作用域或文件作用域. 其中,块是用一对花括号括起来的代码区域.例如,整个函数体是一个块,函数中的任意复合语句也 ...

  6. 相机内参中cx cy_Opencv中的两种去畸变函数

    前言 参考 OpenCV畸变校正原理以及损失有效像素原理分析 - 一度逍遥 - 博客园 我们知道目前opencv在标定完后得到相机内参及畸变系数,要么通过cv::undistort()直接得到去畸变的 ...

  7. python函数参数传递的两种方式_Python函数的参数传递方式

    Python函数的参数传递方式 一.普通 def add(a,b): return a+b print(add(1,2)) #输出结果:3 二.可选参数 def myjoin(string,sep=' ...

  8. Codeforces Round #702 (Div. 3)---C. Sum of Cubes 两种方法 cbrt()函数应用

    文章目录 题目 思路 代码 题目 题目链接 思路 思路一. 容易联想到枚举所有x存在的情况,用map映射.因为a取值在1e4上. 1e8的时间复杂度枚举,但是map具有自动排序 费时间,炸了. uno ...

  9. 深入理解javascript中的立即执行函数(function(){…})()

    2019独角兽企业重金招聘Python工程师标准>>> javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各 ...

最新文章

  1. 满屏的if-else,看我怎么消灭你!
  2. C++之const修饰得到是谁
  3. web.xml 中的listener、 filter、servlet 加载顺序及其详解
  4. 度秘语音引擎app_语音机器人哪家强 度秘/小冰/Siri/小娜横向评测
  5. 在VS2012中实现Ext JS的智能提示太简单了
  6. java在一个类里实现存款_用Java编写一个简单的存款
  7. 苹果也“翻车”,服务器大面积宕机三小时
  8. 谷歌修复另一枚已遭利用的 Chrome 释放后使用0day,细节未公开
  9. 15.深入理解Zend执行引擎(PHP5)
  10. BZOJ2303 APIO2011方格染色(并查集)
  11. 不要轻率的问自己可以想明白可以确认的问题
  12. 深入JavaScript之JS引擎如何执行JS代码
  13. 扫描工具——Nmap用法详解
  14. STM32解析SBUS信号例程详解
  15. 2017 年前端工具趋势
  16. 【自控原理】第四章 根轨迹法
  17. CSS中的代表的什么
  18. 【转】vim 分割窗口[转]_孤鸿灬的空间_百度空间
  19. 淘系电商再无对手,腾讯为何“资敌”?
  20. Scratch实现正方形幻影效果

热门文章

  1. C#中Json字符串的各种应用类
  2. [LeetCode] Majority Element
  3. ·记2014.5.16的一件小事
  4. Wiki系统分析比较
  5. ECharts.js学习(三)
  6. DB2安全(一)——概述
  7. Ajax中POST和GET的区别
  8. 使用jQuery卸载绑定的事件
  9. windows下python安装Numpy和Scipy模块
  10. Tempter of the Bone(DFS + 奇偶剪枝,好题)