咱們都知道定義函數的方式有兩種,一種是函數聲明,另一種就是函數表達式。數組
語法爲:function關鍵字後跟函數名。例如:瀏覽器
function functionName(arg0) { //函數體 } alert(functionName.name) // "functionName"
函數聲明最主要的特徵就是函數聲明的提高,因此咱們能夠把函數聲明放在調用它的語句的後面,由於執行代碼前會先讀取函數聲明。好比:閉包
hello(); function hello(){ alert("hello"); }
上面的代碼能夠在瀏覽器正常運行。函數
語法以下:code
var functionName = function(arg0){ //函數體 }; alert(functionName.name) // ""
如上所示當咱們輸出函數名時返回了空字符串,由於function關鍵字後面沒有標識符,這種狀況下建立的函數爲匿名函數。接下來咱們就談談利用函數表達式所建立的匿名函數有什麼應用。索引
函數表達式最典型的應用就是模仿塊級做用域,咱們都知道JavaScript沒有塊級做用域,不過咱們能夠用函數表達式模仿塊級做用域。造成獨立做用域,從而避免全局污染。
操做方法:聲明匿名函數,立馬調用。
最經典的例子:ip
function createFunctions(){ var result = []; for (var i=0; i < 10; i++){ result[i] = function(){ return i; }; } return result; } createFunctions();
乍一看每一個函數都應該返回本身的索引值,即位置0的函數返回0,1的返回1,以此類推。實際上每一個函數都將返回10,由於這裏的i是貫穿整個做用域的,咱們把上面代碼修改一下:作用域
//寫法1 (function(){ //這裏是塊級做用域 var result = []; for(var i=0;i<10;i++){ result[i] = (function(num){ return function(){ return num; }; }(i))(); } return result; })(); //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] //寫法2 var hasfunction = function(){ var result = []; for(var i=0;i<10;i++){ result[i] = (function(num){ return function(){ return num; }; }(i))(); } return result; } hasfunction();
在當即執行函數執行的時候,i的值被賦值給num,同時建立返回num的閉包,從而result數組每一個函數都有一個num變量的副本。字符串
完。io