深入理解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