是的,你沒看錯,這篇文章講的不是 ECMAScript 。
目前 VB 14 比 C# 6 領先的功能裡面,有個即將在 C# 7 實現的功能,叫做“本地方法”。這個功能與“匿名委托”的區別是:匿名委托不能直接存儲到自動推斷類型(在C#為var)的變量裡,必須賦值給已經指定委托類型的變量,或者作為參數傳遞。而且匿名委托不允許聲明為迭代器。
利用這個特性,可以 隨便抄網上的JS/ES的代碼 更方便地使用委托,但是需要注意使用閉包規避一些非預期的結果。
本地方法會像其它的Lambda表達式或匿名委托一樣,捕獲上下文的變量。
本地方法裡面的成員不能在外部訪問,因為變量重名了。
如果你不用 Dim 關鍵字 並且使用 Option Explicit Off,那麼沒有聲明變量會是方法級別的變量。注意,不是全局變量。
那麼,怎樣把本地方法裡面的變量取出呢?
這時就需要定義另一個本地方法
執行的結果是彈出一個消息框,內容是 999。
那這個寫法有什麼實際作用呢?
執行結果:消息框內容: 999, 消息框內容:1000
這段代碼中的 f2 把 f1 中定義的 n 變量取了出來。委托 nAdd 修改了 f1 中定義的變量 n 的值。
這種寫法在本地方法中有效,因為本地方法中定義的一切變量會通過名稱類似於 _Closure$__2-0 這樣的類包裝,然後放置到它所在的普通方法的變量區進行存儲。
包含本地方法的普通方法執行完畢之後,_Closure$__2-0 這樣的變量包裝類會脫離作用域,從而導致這個方法裡面的定義的本地方法中的變量隨時可以被GC回收。
警告:這些寫法不要在最終發售的產品中使用,因為後期綁定會帶來性能問題,而且不聲明變量會讓你的代碼裡面有一堆警告(綠色的浪線)。
留個兩個思考題
第一題:消息框裡面寫著什麼?
提示:那個綠色的浪線是VS告訴你這樣寫可能結果跟你想的不一樣
第二題:消息框裡面寫著什麼?
這回沒提示了