淺談 js 語句塊與標籤

來源:互聯網
上載者:User

標籤:c   style   class   blog   code   java   

原文:淺談 js 語句塊與標籤

語句塊是什嗎?
其實就是用 {} 包裹的一些js代碼而已,當然語句塊不能獨立範圍。
可以詳細參見這裡《MDN block》 

也許很多人第一印象 {} 不是對象字面量嗎?怎麼成了語句塊了?
如果在指派陳述式或者運算式裡用的時候,確實是對象字面量,如:

var a = {};({toString:function(){return "hehe"}}) + "...";


是不是很有意思。。
但是直接使用如:

{toString: function(){return "hehe"}}

卻不能正常執行

其實這裡的 {} 只是起到語句塊的作用,而不是對象字面量。
怎麼回事呢,明明就是對象啊。。
其實這裡要說到標籤了。

我簡單描述下標籤是什麼,如果想詳細瞭解,請移步 《MSN label》 

我是標籤: var a = 1;


一切正常,從 MSN label 裡可以看到,標籤往往是結合  continue, break  一起使用的。
知道標籤是什麼了,就可以回到剛才的問題上了。
 {toString: function(){return "hehe"}} 其實就是

{ // 語句塊    標籤: function(){return "hehe"}}

由於  function(){return "hehe"}  既不是函式宣告,也不是函數運算式,所以就報錯了。
我們只要簡單修改下,修改成函式宣告或者函數運算式即可。

{ // 語句塊    標籤1: function test1(){return "hehe"};    標籤2: var test2 = function(){return "hehe"};}

可以看到一切正常,這個就是語句塊和標籤
它可以構成非常像對象字面量的語句,但其實它仍然是 語句塊 + 標籤 而已。

還記不記得你用 eval 解析 json 的時候,不加 () 就報錯麼。
其實現在非常容易解釋了,因為當直接執行 {} 的時候,只把內部代碼當作語句塊執行,而不是對象字面量。
加上 () 就是讓它當作運算式執行,所以才能正常解析成對象字面量。
這也是上面這個  ({toString:function(){return "hehe"}}) + "...";  必須加 () 的原因。

其實你完全可以這樣寫你的代碼:

程式猿A寫的功能塊: {    // 功能塊代碼...}程式猿B寫的功能塊: {    // 功能塊代碼...}

這樣是不是很清晰?

但是不推薦這樣寫,因為語句塊起不到獨立範圍的功能,所以很容易全域汙染。
依然推薦

(function () {    // 功能塊代碼...})();

自調用函數,不僅可以獨立範圍,還可以在 UglifyJS,Closure Compressor 等工具編譯的時候更加最佳化。

好了,我們來個小小的測試吧。
1. 執行  a: b: c: d: e: 1, 2, 3, 4, 5  結果是什嗎? 為什嗎? 那  a:{b:{c:1}}  呢?

2. 執行  1 + {valueOf:function(){return 1}}  結果是什嗎? 為什嗎?

 

好了,今天的分享就這些了,如有不對之處,請跟帖指出,小生先謝過了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.