一般函數:
function show1(name){ alert(name); //列印:zhangsan }show1("zhangsan");
匿名函數:
var show2 = function (name) { alert(name); //列印:張三 }show2("張三");
上面2種定義函數的區別:
1.我們知道所有的function都會在window對象裡
function show1(name){ alert(name); //列印:張三 } window.show1("張三");
即使在函數定義之前調用
window.show1("張三"); function show1(name){ alert(name); //列印:張三 }
這是因為這種”有名字”的函數在JS引擎初始化的時候就載入到範圍裡面
2.如果是匿名函數
window.show2("李四"); var show2 = function (name) { alert(name); //列印:李四 }
控制台會列印:TypeError: window.show2 is not a function
二、如果我們需要合并上面2個函數
<script> function show(name) { return function () { alert(name); //內建函式是可以調用外層的變數的 } } show("王五");</script>
猜猜會列印什麼。什麼也沒有,也不會報錯。這是因為執行show()只是返回了一個函數本身,並沒有執行這個函數。
show("王五")();
這樣執行,就列印:王五
如果裡面的函數也要傳入變數
<script> function show(name) { return function (age) { alert(name); //列印:王五 alert(age); //列印:18 } } show("王五")(18);</script>
<script> function show(name) { return function (name) { alert(name); } } show("王五")(18);</script>
猜猜是列印“王五”還是“18”。只會列印“18”。
三、匿名函數的自執行
<script> (function (name) { alert(name); //列印:哈哈 })("哈哈")</script>
以上是推薦的寫法。
其他寫法:
-function (name) { alert(name); //列印:哈哈 }("哈哈")
+function (name) { alert(name); //列印:哈哈 }("哈哈")
!function (name) { alert(name); //列印:哈哈 }("哈哈")
[function (name) { alert(name); //列印:哈哈 }("哈哈")]
new function (name) { alert(name); //列印:哈哈 }("哈哈")
~function (name) { alert(name); //列印:哈哈 }("哈哈")
void function (name) { alert(name); //列印:哈哈 }("哈哈")