Javascript是一種由Netscape的LiveScript發展而來的原型化繼承的物件導向的動態類型的區分大小寫用戶端指令碼語言,主要目的是為瞭解決伺服器端語言,比如Perl,遺留的速度問題,為客戶提供更流暢的瀏覽效果。
Javascript有很多有趣的用法,在Google Code Search裡能找到不少,舉一個例子:
- <script>
- ~function() {
- alert("hello, world.");
- }();
- </script>
試一下就知道這段代碼的意思就是聲明一個函數,然後立刻執行,因為Javascript中的變數範圍是基於函數的,所以這樣可以避免變數汙染,但這裡的位元運算符“~”乍一看讓人摸不到頭腦,如果去掉它再運行則會報錯:SyntaxError。
在闡述為什麼之前,讓我們先來明確Javascript中的兩個概念:函式宣告和函數運算式:
先來看看什麼樣的是函式宣告:
- <script>
- function()
- {
- alert("hello, world.");
- };
- function foo()
- {
- alert("hello, world.");
- };
- </script>
再來看看什麼樣的是函數運算式:
- <script>
- var foo = function()
- {
- alert("hello, world.");
- };
- </script>
現在回頭看看文章開頭的問題,為什麼去掉位操作符“~”後運行會報錯,這是因為從文法解析的角度看,Javascript不允許在函式宣告的後面直接使用小括弧,而函數運算式則沒有這個限制,通過在函式宣告前面加上一個“~”操作符,就可以讓文法解析器把後面看成是函數運算式,同樣的,在函式宣告前面加上“!,+,-”等操作符也是可行的。
那我們為什麼不使用下面這種函數運算式的方式呢?
- <script>
- var foo = function()
- {
- alert("hello, world.");
- }();
- </script>
雖然從文法解析的角度看沒有問題,但是上面的代碼存在弊端,它引入了一個變數,可能會汙染現有的運行環境,帶來潛在的問題。
使用位操作符“~”的方法多少顯得有點奇技淫巧,其實把函式宣告用小括弧套起來更易讀:
- <script>
- (function()
- {
- alert("hello, world.");
- })();
- </script>
弄明白了原理,不管遇到什麼寫法,都不會再丈二和尚摸不著頭腦了。