文档章节

关于expres模板引擎,Function,with

m2012
 m2012
发布于 2014/05/15 09:37
字数 449
阅读 121
收藏 1

本文只是一些很零散的东西,关于js的模板引擎方面的知识。

看 Node in Action的时候,有一章关于ejs,看到这样的一个片段:

<% if (locals.messages) { %>
后面省略若干行

这个 locals 让我迷惑不解,因为根据资料,express只是暴露了一个settings到app.locals,并没有暴露这个locals。 后来看了ejs的部分源码,才知道这个locals存在的原因,其实ejs工作机制的缘故。 现在开始说一下背景知识。

new Function的魔法

在js里,可以创建一个匿名函数,然后赋值给一个变量:

var fn = function(x, y) { return x + y; };

但是,除了这种方法,还有一种更灵活的方法来创建前面的函数:

var fn = new Function("x, y", "return x + y;");

这是很多魔法的来源,它实际上代表了一种思想:用代码创造代码

with关键字

js里有一个with关键字, 先看个例子:

var t = { name : { firstname: "tom" }, age: 12 }
with (t.name) {
  console.log(firstname); // 输出 tom
  firstname = "jack"
}

console.log(t.name.firstname) // 输出 jack

没啥问题。但是,再看这个:

var t = { name : { firstname: "tom" }, age: 12 }
with (t.name) {
  
  firstname = "jack"

  console.log(firstname); // 输出 jack
  console.log(t.name.firstname); //输出 jack

  t.name = {
    firstname: "mike"
  };

  console.log(firstname); // 输出 jack
  console.log(t.name.firstname); //输出 mike
}

console.log(t.name.firstname) // 输出 mike

with里面发生了什么事情呢?其实很简单,可以这样理解上面的代码:

var t = { name : { firstname: "tom" }, age: 12 };


(function(scope) {   
  scope.firstname = "jack"

  console.log(scope.firstname);  // 输出 jack
  console.log(t.name.firstname); // 输出 jack , 因为现在scope 和 t.name 是 同一个对象

  t.name = {
    firstname: "mike"
  };

  console.log(scope.firstname); // 输出 jack,因为 scope 和 现在的t.name 是两个独立无关的对象了!
  console.log(t.name.firstname); //输出 mike
})(t.name); // 把 t.name 传进去

console.log(t.name.firstname) // 输出 mike

所谓指向对象的变量,其实就是指针而已。

未完

© 著作权归作者所有

上一篇: Linked List Cycle II
下一篇: npm镜像使用方法
m2012
粉丝 16
博文 129
码字总数 52548
作品 0
广州
程序员
私信 提问
加载中

评论(1)

liango
liango
所谓指向对象的变量,其实就是指针而已。
Underscore _.template 方法使用详解

https://github.com/hanzichi/underscore-analysis/issues/26 前文 浅谈 Web 中前后端模板引擎的使用 我们简单了解了模板引擎在前后端的应用场景,本文重点深入 Underscore 的模板函数 _.te...

壹峰
2018/12/19
24
0
编写一个简单的JavaScript模板引擎

本文首发于我的知乎专栏,转发于掘金。若需要用于商业用途,请经本人同意。 尊重每一位认真写文章的前端大佬,文末给出了本人思路的参考文章。 前言 能够访问到这篇文章的同学,初衷是想知道...

凯斯
2018/07/03
0
0
高性能JavaScript模板引擎原理解析

本文将用最简单的示例代码描述现有的 javascript 模板引擎的原理,包括新一代 javascript 模板引擎 artTemplate 的特性实现原理,欢迎共同探讨。 artTemplate 介绍 artTemplate 是新一代 ja...

李朝强
2013/07/29
262
0
推荐五款流行的JavaScript模板引擎及其工作原理

当你创建JavaScript应用时,你必然会用到JavaScript模板。当对HTML进行更新时,你可使用模板来代替库(如jQuery),使用模板可以大大简化你的代码。该文将例举当前较流行的一些模板库。 一、...

菜鸟的进阶
2017/10/19
211
0
基于Express+mongoose搭建的学生管理系统(2017-08-07)

上一周学了下mongoose,虽然学了点皮毛,但还是想写写总结总结,这也是我的第一篇技术博客。还是蛮开心的,happy~~来,切入正题!项目源码我会放在github上。 github 地址 代码目录 secondPo...

ShineTomorrow
2017/11/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JavaScript权威指南笔记5

第五章、语句 0、概述 JS程序是一系列可执行语句的集合。 通过控制语句来改变语句的默认执行顺序。 控制语句:条件、循环和跳转(如return、break和throw) 2、复合语句 当多条语句被当做一条语...

_Somuns
5分钟前
0
0
vmware安装ubuntu18.04总是 panic -not syncing:corrupted stack end detected inside schedule

Vmware 安装ubuntu 总是卡着不动, 提示panic -not synciong 网上提示很多办法,都试了效果不佳, 找到了完美解决办法 你的兼容模式重新选一下为6.0,兼容性对硬件有要求的 即可实现 成功安装...

dragon_tech
13分钟前
2
0
centos7 安装 mysql5.7 版本(全)

centos 安装 版本说明 :centos7,mysql5.7 ,不是 centos7 可能有些命令不兼容 安装 mysql-server # 下载并安装 mysql yum wget -i -c http://dev.mysql.com/get/mysql57-community-relea......

sanri1993
42分钟前
4
0
Spring3.x升级到Spring4.x-5.x时关于MappingJacksonHttpMessageConverter的报错问题

在Spring4.x或者以上的版本强使用(不然会报错): org.springframework.http.converter.json.MappingJackson2HttpMessageConverter 如果是Spring4.0获者以下的版本可以使用MappingJacksonH...

code-ortaerc
45分钟前
4
0
OSG 渲染状态污染到其它节点怎么解决?

在根节点补上初始状态

洛克人杰洛
47分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部