js中的自执行匿名函数 (function(){})()

JS函数有两种命名方式

一、声明式

声明式会致使函数提高,function会被解释器优先编译。即咱们用声明式写函数,能够在任何区域声明,不会影响咱们调用。html

function XXX(){}

 

二、函数表达式

函数表达式咱们常常使用,而函数表达式中的function则不会出现函数提高。而是JS解释器逐行解释,到了这一句才会解释。函数

所以若是调用在函数表达式以前,则会调用失败。spa

var k = function(){}
fn1();
function fn1(){}//能够正常调用
 
fn2();
var fn2 = function(){}//没法调用

 产生的缘由

如今进入正题,对函数表达式加上(),是能够直接调用的 
可是若是是对声明式的后部加上()则是会被编译器忽略。.net

var fn2 = function(){}();//对,就是这样
function fn1(){}();//会被忽略

而日常的function(){}则是一种声明式,若是加上()括号后,则会被编译器认为是函数表达式,(加上+-号均可以),从而能够用()来直接调用code

function fn1(){})();

 

 

自执行匿名函数

自执行函数,即定义和调用合为一体。htm

咱们建立了一个匿名的函数,并当即执行它,因为外部没法引用它内部的变量,所以在执行完后很快就会被释放,关键是这种机制不会污染全局对象。对象

  • 常见格式:
    (function() { /* code */ })();
  • 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号当即执行返回的未命名函数,括号内为匿名函数的参数。
  • 做用:能够用它建立命名空间,只要把本身全部的代码都写在这个特殊的函数包装内,那么外部就不能访问,除非你容许(变量前加上window,这样该函数或变量就成为全局)。
    各JavaScript库的代码也基本是这种组织形式。

总结一下,执行函数的做用主要为 匿名 和 自动执行,代码在被解释时就已经在运行了。blog

// 下面2个括弧()都会当即执行  
(function () { 
   //我是匿名方式1----推荐使用这个----这种常常用来构建沙箱模式
 } ())  
(function () { 
   //我是匿名方式2
 })()
  
// 因为括弧()和JS的&&,异或,逗号等操做符是在函数表达式和函数声明上消除歧义的  
// 因此一旦解析器知道其中一个已是表达式了,其它的也都默认为表达式了  
var i = function () { return 10; } ();  
true && function () { /* code */ } ();  
0, function () { /* code */ } ();  
  
// 若是你不在乎返回值,或者不怕难以阅读
// 你甚至能够在function前面加一元操做符号  
!function () { /* code */ } ();  
~function () { /* code */ } ();  
-function () { /* code */ } ();  
+function () { /* code */ } ();  
  
// 还有一个状况,使用new关键字,也能够用,但我不肯定它的效率  
// http://twitter.com/kuvos/status/18209252090847232  
new function () { /* code */ }  
new function () { /* code */ } () // 若是须要传递参数,只须要加上括弧()  

 

 

 

 

参考原文:ip

https://blog.csdn.net/figo333/article/details/80276302编译器

https://www.cnblogs.com/beijingstruggle/p/5970824.html

https://blog.csdn.net/sinat_17775997/article/details/80263581

相关文章
相关标签/搜索