匿名函數:創建函數時,不指定函數名的函數。此種函數只能運行一次,可以避免變數全局污染,保護變數。 匿名函數可以回調使用,比如 btn.addEventListener("click",function(){...}) 也可以用匿名函數聲明函數名,比如var abc=function (){conso ...
匿名函數:創建函數時,不指定函數名的函數。此種函數只能運行一次,可以避免變數全局污染,保護變數。
匿名函數可以回調使用,比如 btn.addEventListener("click",function(){...})
也可以用匿名函數聲明函數名,比如var abc=function (){console.log(222)}
這種方法定義的函數和function abc(){console.log(222)}有什麼區別呢?
abc() //報錯 變數提升但是函數沒有 var abc=function(){ console.log(222) } abc() //2222 函數聲明放在任意位置都可以被調用; function abc(){ console.log(2222) }
匿名函數也可以自己調用自己執行,有兩種方式可以實現方式
+function(...){...}(...)
(function(...){...})(...)
閉包:一個可以使用另外一個函數(外函數)作用域中的變數的函數(內函數)。
原理就是外部函數作用域(AO)在作用域鏈下不被釋放可以被重用。
釋放AO的先後順序為先釋放內函數AO,再釋放外函數AO。
閉包有3個特點:1.有內外兩個函數2.要有return值3.要有受保護的變數
在javaScript高級教程設計書中這麼介紹閉包的缺點
function createFunction(){ var result=new Array; for(var i=0;i<10;i++){ result[i]=function(){ return i; } } return result; }
錶面上看每個函數似乎應該返回自己的索引值,但實際上每個函數返回10。因為每個函數的作用域鏈中都保存者createFunction()函數的活動對象,所以他們引用的都是同一個變數i。當createFunction()函數返回後,變數i的值是10;
function createFunction(){ var result=new Array; for(var i=0;i<10;i++){ result[i]=function(num){ return function(){ return num; }; }(i); } return result; }
在這個版本中,我們沒有直接把閉包賦值給數組,而是定義了一個匿名函數,並將立即該匿名函數的結果賦給數組。這裡的匿名函數有一個參數num,也就是最終的函數要返回的值。在調用每個匿名函數時,我們傳入變數i。又創建並返回了一個訪問num的閉包。這樣一來,result數組中的每個函數都有自己num變數的一個副本,因此就可以返回各自的不同的值
總結:匿名函數都和閉包除了都是函數,並沒有共同點。