Javascript中的函數(shù)聲明和函數(shù)表達(dá)式
Javascript是一種由Netscape的LiveScript發(fā)展而來的原型化繼承的面向?qū)ο蟮膭?dòng)態(tài)類型的區(qū)分大小寫的客戶端腳本語言,主要目的是為了解決服務(wù)器端語言,比如Perl,遺留的速度問題,為客戶提供更流暢的瀏覽效果。
Javascript有很多有趣的用法,在Google Code Search里能找到不少,舉一個(gè)例子:
- <script>
- ~function() {
- alert("hello, world.");
- }();
- </script>
試一下就知道這段代碼的意思就是聲明一個(gè)函數(shù),然后立刻執(zhí)行,因?yàn)镴avascript中的變量作用域是基于函數(shù)的,所以這樣可以避免變量污染,但這里的位運(yùn)算符“~”乍一看讓人摸不到頭腦,如果去掉它再運(yùn)行則會(huì)報(bào)錯(cuò):SyntaxError。
在闡述為什么之前,讓我們先來明確Javascript中的兩個(gè)概念:函數(shù)聲明和函數(shù)表達(dá)式:
先來看看什么樣的是函數(shù)聲明:
- <script>
- function()
- {
- alert("hello, world.");
- };
- function foo()
- {
- alert("hello, world.");
- };
- </script>
再來看看什么樣的是函數(shù)表達(dá)式:
- <script>
- var foo = function()
- {
- alert("hello, world.");
- };
- </script>
現(xiàn)在回頭看看文章開頭的問題,為什么去掉位操作符“~”后運(yùn)行會(huì)報(bào)錯(cuò),這是因?yàn)閺恼Z法解析的角度看,Javascript不允許在函數(shù)聲明的后面直接使用小括號(hào),而函數(shù)表達(dá)式則沒有這個(gè)限制,通過在函數(shù)聲明前面加上一個(gè)“~”操作符,就可以讓語法解析器把后面看成是函數(shù)表達(dá)式,同樣的,在函數(shù)聲明前面加上“!,+,-”等操作符也是可行的。
那我們?yōu)槭裁床皇褂孟旅孢@種函數(shù)表達(dá)式的方式呢?
- <script>
- var foo = function()
- {
- alert("hello, world.");
- }();
- </script>
雖然從語法解析的角度看沒有問題,但是上面的代碼存在弊端,它引入了一個(gè)變量,可能會(huì)污染現(xiàn)有的運(yùn)行環(huán)境,帶來潛在的問題。
使用位操作符“~”的方法多少顯得有點(diǎn)奇技淫巧,其實(shí)把函數(shù)聲明用小括號(hào)套起來更易讀:
- <script>
- (function()
- {
- alert("hello, world.");
- })();
- </script>
弄明白了原理,不管遇到什么寫法,都不會(huì)再丈二和尚摸不著頭腦了。
【編輯推薦】