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


深入理解函数声明,函数表达式,匿名函数的区别:

  函数声明:function myName(){} ,使用function声明一个函数,再指定一个函数名,就是函数声明
  函数表达式:var myName=function(){} 使用function声明一个匿名函数,再将匿名函数赋值给一个变量,交做函数表达式  
  匿名函数
:function (){} 使用function声明一个函数,但是没有给函数命名,所以叫做匿名函数,匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序,还有闭包的使用等等。  
  函数声明和函数表达式的区别:1.JavaScript引擎在解析JavaScript代码时会“函数声明提升”当前执行环境上的函数声明,而  函数表达式则要JavaScript引擎执行到它所在位置时,才会从上往下一行行的进行解析 2.函数表达式后面可以加()立即调用该函数,而函数声明不可以,只能通过myName()形式调用。
//例子:
 1 myName();
 2 function myName(){};
 3 //正常,因为'提升'了函数声明,函数调用可以在函数声明前。
 4 myName();
 5 var myName= function () {};
 6 //报错,myName还未保存对函数的引用,函数调用应该在函数表达式之后。
 7 var myName= function () {
 8     alert('hello word');
 9 }();
10 //函数表达式后面加括号,当JavaScript引擎解析到这时,会立即调用该函数表达式
11 function myName(){
12     alert('hello word');
13 }
14 //不会报错,但是JavaScript只会解析函数声明,忽略后面的括号,函数声明不会被调用
15 function () {
16     console.log('hello');
17 }();
18 //报错了。语法错误。虽然匿名函数属于函数表达式,但是JavaScript引擎将开头的function看做是函数声明了

  理解了一些函数的基本概念之后,就能明白(function(){}());与(funtion(){})();这两种立即执行函数的写法,由于这个匿名函数是函数表达式,所以在后面加上()可以立即调用。

 1 (function () {
 2     alert('hello');  //使用的是()运算符
 3 })();
 4 
 5 (function () {
 6     alert('hello');  //使用的是()运算符
 7 }());
 8 
 9 !function () {
10     alert('hello');  //使用的是!运算符
11 }();
12 
13 +function () {
14     alert('hello');  //使用的是+运算符
15 }();
16 
17 -function () {
18     alert('hello');  //使用的是-运算符
19 }();
20 
21 var myName=function(){
22     alert('hello');  //使用的是=运算符
23 }();
  在function函数前面加上(),!,+,-,=甚至逗号等都可以起到函数定义后立即执行的效果,是因为这些运算符将函数声明变成了函数表达式,消除了JavaScript引擎对函数声明及函数表达式的歧义,告诉JavaScript引擎这是一个函数表达式,并且可在后面加上括号来立即执行函数。

不过这样的写法有什么用呢?

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


本文转载自http://www.jb51.net/article/50967.htm
posted @ 2017-09-22 15:58  gaochao5kuba  阅读(232)  评论(0)    收藏  举报