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

相關文章
相關標籤/搜索