原文連接:https://my.oschina.net/u/2331760/blog/468672?p={{currentPage+1}}javascript
函數基本概念:java
函數聲明:function box(){}jquery
函數表達式:var box = function(){};安全
匿名函數:function(){} 屬於函數表達式閉包
匿名函數的做用:若是將匿名函數賦值給一個變量,則聲明瞭一個函數: var box= function(){};函數
若是將匿名函數賦予一個事件則成爲事件處理程序: box.addEventListener("click",function(){alert("aaa")});.net
建立閉包:(function(){})()blog
函數定義的三種方法:事件
var box = function(){};ip
function box(){}
var box = new Function();
函數聲明和函數表達式的不一樣:
js在進行預解析時函數聲明會提高,而函數表達式必須js順序執行到此函數代碼時纔會逐行解析
函數表達式後面加括號能夠當即執行函數,函數聲明不能夠,只能以fnName()的方式調用才行
實例:
box(); function box(){ alert("aaa"); }
//正常,由於js在解析階段函數聲明會被提高到最前面,因此函數聲明能夠在函數執行後面
//實際順序
//function box(){
alert("aaa");
}
//box();
box();
var box = function(){
alert("aaa");
}
//報錯,實際上的順序是
//var box = undefined;
//box();
//box = function(){
alert("aaa");
}
//因此當執行到box()時,此時box不是一個函數
var box = function(){
alert("aaa");
}()
//正確 函數表達式後面加括號,當執行到後面的括號時js會自動執行此函數
function box(){
alert("aaa");
}()
//不會報錯,可是隻會解析函數聲明,忽略後面的括號,不會自執行
function(){
alert("aaa")
}()
//語法錯誤
//雖然匿名函數屬於函數表達式,但未進行賦值給一個變量
//當js解析到function時,將其當作函數聲明,報錯,須要一個函數函數名
函數自執行
(function(a){ alert(a); })("123") //"123" 使用()運算符 (function(a){ alert(a); }("123")) //"123" 使用()運算符 !function(a){ alert(a); }("123") //"123" 使用!運算符
+function(a){
alert(a);
}("123")
//"123" 使用+運算符
-function (a){
alert(a);
}("123")
//"123" 使用-運算符
var fn= function(a){
alert(a);
}("123")
//"123" 使用=運算符
在function前面加!、+、-、=均可以將函數聲明轉化爲函數表達式,消除了js引擎識別函數聲明和函數表達式的歧義,
加()是最安全的方法,省得其餘的和函數返回值進行運算
不過這樣的寫法有什麼用呢?
javascript中沒用私有做用域的概念,若是在多人開發的項目上,你在全局或局部做用域中聲明瞭一些變量,可能會被其餘人不當心用同名的變量給覆蓋掉,
根據javascript函數做用域鏈的特性,可使用這種技術能夠模仿一個私有做用域,用匿名函數做爲一個「容器」,
「容器」內部能夠訪問外部的變量,而外部環境不能訪問「容器」內部的變量,
因此( function(){…} )()內部定義的變量不會和外部的變量發生衝突,俗稱「匿名包裹器」或「命名空間」。
JQuery使用的就是這種方法,將JQuery代碼包裹在( function (window,undefined){…jquery代碼…} (window)中,在全局做用域中調用JQuery代碼時,能夠達到保護JQuery內部變量的做用。