元語言基礎技術之 在JS中如何自由地建立函式

2021-08-22 17:45:30 字數 1705 閱讀 7315

在前面講元語言

的過程中,有些技術細節就忽略了。其中之一,就是這個建立函式的方法。這裡開個小主題來講講。

在js裡面,我們可以用任意方法來構建物件,包括直接量和構造器。在使用構造器時,也可以有基於原型和基於屬性抄寫兩種方法(以及這兩種方法混用)。下面的例子簡要地說明這些物件的構造方法:

---------

// 直接量物件宣告

obj =

// 使用基於原型繼承的方法來構造物件

function myobject()

myobject.prototype =

obj = new myobject();

// 使用基於屬性抄寫的方法來構造物件

function myobject2

obj = new myobject2();

---------

物件創生的方法很多也很靈活,而且靈活應用,還能產生更加複雜的技術方法。但作為js另外一半的「函式」,它的創生方法就不那麼方便了。它只有兩種方法:

---------

// 宣告函式直接量

function x()

// 建立函式

x = new function();

---------

注意這裡的建立函式,在js中,有且僅有這樣一種語法能「動態地」建立出乙個函式來。然而,如果我們試圖對建立函式的過

簡而言之,我就是想要實現乙個構造器——類似於function。這個構造器能像建立物件一樣,建立出函式了。這與元語言系統之間的關係在於:有了「能建立函式的函式」,就等於有了「元函式」。而「元函式+元資料(元類、元物件、基元型別)」就構成了乙個完整的元語言系統——其中「基元型別」也就是值型別。

那麼,如何構造出乙個函式呢?

---------

f = new function(....);

---------

但可能沒幾個人想過,function也可以象下面這樣使用:

---------

---------

o!居然可以這樣嗎?哈哈,是的。而且,這樣一來,我們可以自由地處理函式的建立引數、以及寫自己的「元函式」。

簡單地說,我們可以這樣寫:

---------

function arrayfactory()

x = new arrayfactory();// 得到函式

x = new x(); //<--用作構造器,或作為函式直接執行

---------

我們也可覆蓋系統的function函式,以使得它對引數做一些預處理:

---------

void function = function(f)

}(function);

x = new function(..................); // 得到函式

x = new x(); //<--用作構造器,或作為函式直接執行

---------

由於上述性質,我們可以構建任意複雜的「函式+物件」系統。而更深層面的意義在於:「函式+物件」實際上映**「演算法+資料結構」兩個方面的性質,因此,從js的元語言系統開始,我們可以構建任意複雜的語言,或者任意複雜的執行系統。

JS 語言基礎

兩個變數 相加 var s 今天下雨了 var i 10 alert i s 這裡的i s是拼接的意思 顯示出來是 今天下雨了10 假設我改 s 20 這裡的i s還是拼接的意思 因為s 20 帶引號 還是字串型別 轉換型別 parse 資料型別 我要把i和是數字想數字運算 那麼 要把s的型別轉換成...

初學Qt之 在Qt中呼叫外部C語言模組

呼叫外部已編譯好的c語言模組,傳遞引數並將結果返回列印出來。c語言模組 cpp view plain copy print?test.c 用gcc編譯後生產那個的可執行檔案test放在.invokec c 目錄下 include int main int argc,char argv test.c ...

js基礎中的基礎

昨天看了下js很基礎的東西,這裡大致做了點筆記,想if判斷和迴圈這些就沒有記筆記了,因為感覺都是差不多的。在js中宣告變數和變數的宣告週期 在js中宣告在函式外的變數是全域性變數,也就是在整個程式裡有效,而在函式中宣告的變數是區域性變數,只在此函式中有效,但是還是有一點要注意的就是如果在函式中宣告變...