with關鍵字 正則 實現ejs模版

2021-09-12 06:20:38 字數 1542 閱讀 3083

with關鍵字通常被當作重複引用同乙個物件中的多個屬性的快捷方式,可以不需要重複引用物件本身 比如

var obj =

//單調乏味的重複「obj」

obj.a =2;

obj.b =3;

obj.c =4;

//簡單的快捷方式

with

(obj)

但這實際上並不僅僅是為了方便訪問物件的屬性,考慮如下**:

function

foo()}

;var o1 =

;var o2 =

foo(o1)

;console.

log(o1.a)

//2

foo(o2)

;console.

log(o2.a)

// undefined

console.

log(a)

//2 不好,a被洩露到全域性作用域上了

這個例子中建立了o1和o2 兩個物件。其中乙個具有a屬性,另外乙個沒有。foo(…)函式接受乙個obj引數。該引數是乙個物件的引用,並對這個物件執行了 with(obj) 。我們的**看起來只是對變數a 進行簡單的詞法引用,實際上就是乙個lhs 引用,並將2賦值給他。

當我們將o1傳進去, a =2 賦值操作找到了o1.a 並將2 賦值給他。 而當o2傳進去他並沒有a屬性,因此不會建立這個屬性, o2.a保持undefined但是可以看到乙個奇怪的現象就是,實際上a=2的賦值操作建立了乙個全域性的變數a;

這是with的一些坑 還有一些效能上特性 可以參考《你不知道的jacascript》中第二章部分的詳述。

我們這裡利用with的這一語法特性 配合正則來實現ejs模版的功能

let str =

`<%if(user)else%>`;

//它的原理就是拼出一段函式體**,然後把options做為作用域變數提供屬性

let options =

, total:10}

;function

render

(str, options, callback)";

}); str = str.

replace

(/<%([\s\s]+?)%>/g

,function()

);let tail =

"`}\n return template; "

;let html = head + str + tail;

let fn =

newfunction

('options'

, html)

;let result =

fn(options)

;return result;

}let result =

render

(str, options)

;//hello test

new關鍵字 this關鍵字 base關鍵字

使用new,所做的三件事 1.類是引用物件,引用物件是在堆中開闢空間 在堆中開闢空間 2.在開闢的堆空間中建立物件 3.呼叫物件的構建函式 4.隱藏父類成員 子類的成員可以與隱藏從父類繼承的成員,類似於重寫。public new void sayhello this關鍵字的使用 1.代表當前類的物件...

this關鍵字 static關鍵字

1.當成員變數和區域性變數重名,可以用關鍵字this來區分 this 代表物件,代表那個物件呢?當前物件 this就是所在函式所屬物件的引用 簡單說 那個物件呼叫了this所在的函式,this就代表哪個物件 this也可以用於在建構函式中呼叫其他建構函式 注意 只能定義在建構函式的第一行,因為初始化...

base關鍵字 this關鍵字

用於在派生類中實現對基類公有或者受保護成員的訪問,但是只侷限在建構函式 例項方法和例項屬性訪問器中。功能主要包括 1 呼叫基類上已被其他方法重寫的方法。2 指定建立派生類例項時應呼叫的基類建構函式。base常用於,在派生類物件初始化時和基類進行通訊。base可以訪問基類的公有成員和受保護成員,私有成...