( function(){…} )()和( function (){…} () )是两种立即执行函数
生活随笔
收集整理的這篇文章主要介紹了
( function(){…} )()和( function (){…} () )是两种立即执行函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
函數聲明:function fnName () {…};
函數表達式 var fnName = function () {…};
匿名函數:function () {};?
?
fnName(); function fnName(){alert(12); }//正常,函數聲明調用前就已存在,所以函數調用可在函數聲明之前 fnName(); var fnName=function(){ alert(123); }//報錯,函數表達式,屬于按順序執行,變量fnName還未保存對函數的引用,所以函數調用必須在函數表達式之后 var fnName=function(){ alert(1234); }();//函數表達式后面加括號,當javascript引擎解析到此處時能立即調用函數 function fnName(){ alert(12345); }();//不會報錯,但是javascript引擎只解析函數聲明,忽略后面的括號,函數聲明不會被調用 function(){ console.log(123456); }();//語法錯誤,雖然匿名函數屬于函數表達式,但是未進行賦值操作, //所以javascript引擎將開頭的function關鍵字當做函數聲明,報錯:要求需要一個函數名?
?
( function(){…} )()和( function (){…} () )是兩種立即執行函數
這3種寫法等效:
var client = function() { alert("Chrome");}();?
var client = (function() { alert("Chrome");}());
var client = (function() { alert("Chrome");})();
?
立即執行的其他寫法:?
(function(a,b){console.log(a,b); //控制臺輸出123,使用()運算符 })(123,456); (function(a){ console.log(a); //控制臺輸出1234,使用()運算符 }(1234)); !function(a){ console.log(a); //控制臺輸出12345,使用!運算符 }(12345); +function(a){ console.log(a); //控制臺輸出123456,使用+運算符 }(123456); -function(a){ console.log(a); //控制臺輸出1234567,使用-運算符 }(1234567); var fn=function(a){ console.log(a); //控制臺輸出12345678,使用=運算符 }(12345678)在function前面加!、+、 -甚至是逗號等到都可以起到函數定義后立即執行的效果,而()、!、+、-、=等運算符,都將函數聲明轉換成函數表達式,消除了javascript引擎識別函數表達式和函數聲明的歧義,告訴javascript引擎這是一個函數表達式,不是函數聲明,可以在后面加括號,并立即執行函數的代碼。?
加括號是最安全的做法,因為!、+、-等運算符還會和函數的返回值進行運算,有時造成不必要的麻煩。?
這樣寫的作用:?
javascript中沒用私有作用域的概念,如果在多人開發的項目上,你在全局或局部作用域中聲明了一些變量,可能會被其他人不小心用同名的變量給覆蓋掉,根據javascript函數作用域鏈的特性,可以使用這種技術可以模仿一個私有作用域,用匿名函數作為一個“容器”,“容器”內部可以訪問外部的變量,而外部環境不能訪問“容器”內部的變量,所以( function(){…} )()內部定義的變量不會和外部的變量發生沖突,俗稱“匿名包裹器”或“命名空間”?
JQuery使用的就是這種方法,將JQuery代碼包裹在( function (window,undefined){…jquery代碼…} (window)中,在全局作用域中調用JQuery代碼時,可以達到保護JQuery內部變量的作用。?
轉載于:https://www.cnblogs.com/pbblogs/p/9525692.html
總結
以上是生活随笔為你收集整理的( function(){…} )()和( function (){…} () )是两种立即执行函数的全部內容,希望文章能夠幫你解決所遇到的問題。