聲明式會致使函數提高,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 */ })();
總結一下,執行函數的做用主要爲 匿名 和 自動執行,代碼在被解釋時就已經在運行了。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