原文出處: http://www.dnew.cn/post/196.htm
先看下下面幾種寫法
1.function f(x){return x*x;};f(x);
2.(function(x){return x*x;})(x);
3.(function(x){return x*x;}(x));
第一種我們應該都很熟悉了,這是我們經常使用的寫法。第二第三種都是匿名函數的寫法。
第二種
可以這樣理解:
- var f=function(x) {return x*x;};f()
那我們不通過f這個變數來引用函數就是
- function(){}()
然而這樣肯定是錯誤的就像
- var f=1+2;
- f=f*0;
與
- var f=1+2*0;
結果不同一樣。
要得到正確結果只能:
- f=(1+2)*0;
也就是要明確的標識出程式塊,即:
- (function(){})()
肯你有疑問:括弧“()”到底是不是起到了標識代碼塊的作用?
我們可以用JavaScript的內建函數檢測一下!
舉一個最簡單的例子:
- alert(4)
這段代碼會彈出提示內容是“4”
改成這樣
- (alert)(4)
可以看到執行的效果和上一段代碼一樣。
這種形式的函數執行也被很多JavaScript架構所採用。
第三種,如果你用過jsvm架構的話就會發現裡面的代碼使用了這種形式。
那如何解釋第三種情況呢?
為了弄明白瀏覽器是如何理解這樣的寫法的,我們可以利用一下Mozilla Firefox的錯誤控制台功能。
在代碼中插入一段錯誤碼,程式碼片段如下:
- (function(s){s+s}(1)).splice();
開啟Mozilla Firefox的錯誤控制台,可以看到有如下的錯誤提示
錯誤: (function (s) {})(1) has no properties
源檔案:file:///C:/Documents…….html
行:18
可以認為,瀏覽器對於
- (function(s){s+s}(1))
這樣的代碼按照
- (function (s) {s+s})(1)
來解析的。