关于expres模板引擎,Function,with
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
本文只是一些很零散的東西,關(guān)于js的模板引擎方面的知識(shí)。
看 Node in Action的時(shí)候,有一章關(guān)于ejs,看到這樣的一個(gè)片段:
<% if (locals.messages) { %> 后面省略若干行這個(gè) locals 讓我迷惑不解,因?yàn)楦鶕?jù)資料,express只是暴露了一個(gè)settings到app.locals,并沒(méi)有暴露這個(gè)locals。 后來(lái)看了ejs的部分源碼,才知道這個(gè)locals存在的原因,其實(shí)ejs工作機(jī)制的緣故。 現(xiàn)在開(kāi)始說(shuō)一下背景知識(shí)。
new Function的魔法
在js里,可以創(chuàng)建一個(gè)匿名函數(shù),然后賦值給一個(gè)變量:
var fn = function(x, y) { return x + y; };但是,除了這種方法,還有一種更靈活的方法來(lái)創(chuàng)建前面的函數(shù):
var fn = new Function("x, y", "return x + y;");這是很多魔法的來(lái)源,它實(shí)際上代表了一種思想:用代碼創(chuàng)造代碼
with關(guān)鍵字
js里有一個(gè)with關(guān)鍵字, 先看個(gè)例子:
var t = { name : { firstname: "tom" }, age: 12 } with (t.name) {console.log(firstname); // 輸出 tomfirstname = "jack" }console.log(t.name.firstname) // 輸出 jack沒(méi)啥問(wèn)題。但是,再看這個(gè):
var t = { name : { firstname: "tom" }, age: 12 } with (t.name) {firstname = "jack"console.log(firstname); // 輸出 jackconsole.log(t.name.firstname); //輸出 jackt.name = {firstname: "mike"};console.log(firstname); // 輸出 jackconsole.log(t.name.firstname); //輸出 mike }console.log(t.name.firstname) // 輸出 mikewith里面發(fā)生了什么事情呢?其實(shí)很簡(jiǎn)單,可以這樣理解上面的代碼:
var t = { name : { firstname: "tom" }, age: 12 };(function(scope) { scope.firstname = "jack"console.log(scope.firstname); // 輸出 jackconsole.log(t.name.firstname); // 輸出 jack , 因?yàn)楝F(xiàn)在scope 和 t.name 是 同一個(gè)對(duì)象t.name = {firstname: "mike"};console.log(scope.firstname); // 輸出 jack,因?yàn)?scope 和 現(xiàn)在的t.name 是兩個(gè)獨(dú)立無(wú)關(guān)的對(duì)象了!console.log(t.name.firstname); //輸出 mike })(t.name); // 把 t.name 傳進(jìn)去console.log(t.name.firstname) // 輸出 mike所謂指向?qū)ο蟮淖兞?#xff0c;其實(shí)就是指針而已。
未完
轉(zhuǎn)載于:https://my.oschina.net/mustang/blog/265062
總結(jié)
以上是生活随笔為你收集整理的关于expres模板引擎,Function,with的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 力扣算法题—074搜索二维矩阵
- 下一篇: 解决Div自适应高度的方法(转)