函数常见的几种表现形式:
1. 一般形式(函数声明):
会进行函数的预解释, 函数会进行声明和定义, 在函数体前面或则后面都可以进行调用.
2. 函数表达式(匿名函数):
会进行函数的预解析, 函数会进行声明但是不会定义(赋值), 只能在函数体后面进行调用.
3. 匿名函数:
匿名函数属于函数表达式, JavaScript 引擎将开头的 function 关键字当作函数声明但未进行赋值操作.
函数声明和函数表达式的区别:
一: JavaScript 引擎在解析 JavaScript 代码时会'函数声明提升'(Function declaration Hoisting)当前执行环境 (作用域) 上的函数声明, 而函数表达式必须等到 Javascirtp 引擎执行到它所在行时, 从上至下解析函数表达式.
二, 函数表达式后面可以加括号立即调用该函数, 函数声明不可以, 只能以 fnName()形式调用 .
了解了函数常见的几种表现形式, 我们再来看看立即执行函数两种表现形式:( function(){...} )()和( function (){...} () ), 两种写法是等价的. 立即执行函数能做到立即执行, 不存在预解析.
在 function 前面加!,+, - 甚至是逗号等到都可以起到函数定义后立即执行的效果, 而(),!,+,-,= 等运算符, 都将函数声明转换成函数表达式, 消除了 JavaScript 引擎识别函数表达式和函数声明的歧义, 告诉 JavaScript 引擎这是一个函数表达式, 不是函数声明, 可以在后面加括号, 并立即执行函数的代码.
拓展: 当多个立即执行函数运行过程中抛出错误的相关解析.
根据 ECMAScript 规范分号自动插入规则, 可以知道第一个立即执行函数后没有自动插入 ";", 所以导致最后解析出来的结果如图所示:
解决办法, 在第一个立即执行函数后面加上 ";".
优点: JavaScript 中没有私有作用域的概念, 多人开发过程中在全局或局部作用域中声明了一些变量, 可能会被其他人不小心用同名的变量给覆盖掉, 根据 JavaScript 函数作用域链的特性, 可以使用这种技术可以模仿一个私有作用域, 用匿名函数作为一个 "容器","容器" 内部可以访问外部的变量, 而外部环境不能访问 "容器" 内部的变量, 所以 ( function(){...} )() 内部定义的变量不会和外部的变量发生冲突, 俗称 "匿名包裹器" 或 "命名空间". 深入可以了解下我另一篇关于闭包的知识点.
举例: jQuery 使用的就是这种方法, 将 jQuery 代码包裹在 ( function (Windows,undefined){...jQuery 代码...} (Windows) 中, 在全局作用域中调用 jQuery 代码时, 可以达到保护 jQuery 内部变量的作用.
好了, 谢谢你这么帅, 还能看完我的分享, 希望对你有所帮助(辛辛苦苦写了那么多, 兄 dei, 点个赞再走吧), 送你一朵.