js提供了靈活的函數寫法,我們常見的函數寫法和調用可能是:
function ask(){ console.log(1); } ask();
這樣就完成了函數的定義和調用,司空見慣。
還有js里面的匿名函數我們也不陌生,匿名函數的定義和調用:
1 (function(){console.log(1)})(); 2 (function(){console.log(1)}()):
我們看到匿名函數定義之后立即就被引用了,這其實是立即執行的函數表達式,例如
1 (function(){console.log(1)})();
(function....)這里是一個表達式,然后(function)();這是調用它
而下面的類似,只不過是最后一步計算表達式,但是我們要注意
function(){console.log()}();//error
這種寫法是錯誤的因為匿名函數沒有名字,只有內存地址,而這樣調用是有名字的調用,第一種情況其實是就算了之后(表達式)然后調用的。
還有就是函數表達式,函數表達式也很常見:
1 var a=function(){console.log()} 2 a();
這其實也是先把函數的地址給a,這樣這個匿名函數就變成有名的了,名字就是a,然后a();調用,這就是所謂的函數表達式,當然,我們寫成這種:
1 var a=function(){console.log(1);}()
也是可以的,但這個時候,我們用a();來調用就不行了,因為a這個時候代表的不是函數名,這種方法其實類似於匿名函數的第二個調用方法,是表達式。
最后附一個小的知識點
var a=[]; var x=2; a.push(x); console.log(a[0]); var x=3; console.log(a[0]);
這表明push,push的是變量的值而不是變量的地址,所以數組里放的變量的副本,而不是地址