JavaScript中的DSL元编程介绍


Posted in Javascript onMarch 15, 2015

在看JavaScript Template源码的时候,发现有一个很有意思的用法用来生成函数,想到这不就是元编程么?

JavaScript 元编程

 元编程(Metaprogramming)是指某类计算机程序的编写,这类计算机程序编写或者操纵其他程序(或者自身)作为它们的数据,或者在运行时完成部分本应在编译时完成的工作。

JavaScript eval

 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

可以有下面的用法:
eval("x=10;y=20;document.write(x*y)")

当然这只是用来执行某个函数,只是这货性价比可低了,而且还容易出错。
 eval 函数应该尽可能地避免使用。

于是更好地方法是使用New Function()

使用New Function()和eval()的很大一个区别是,eval不仅仅是一个函数 ,

 eval() 计算一个字符串作为当前执行范围内JavaScript表达式,可以访问本地变量。 New Function() 解析存储在一个字符串转换成一个函数对象,然后可以调用的JavaScript代码。因为代码在一个单独的范围内运行,不能访问本地变量。

也就是说eval()会干扰到当前函数的作用域。。

JavaScript new Function()

 Function 构造器创建一个新的Function 对象. 在JavaScript中每个函数(function)实际是一个Function对象. 使用Function构造器生成的Function对象是在函数创建时被解析的。这比你使用函数声明(function)并在你的代码中调用低效,因为使用函数语句声明的function是跟其他语句一起解析的。

New Function() 相比之下会比较低效,而这也是当前情况下我们所能预知的。

一个简单的示例如下所示:

var add = new Function(['x', 'y'], 'return x + y');

new Function()会将字符串解析为函数。。然后我们可以通过apply来执行
Function.apply(null, args)

而这也是我在JavaScript Template中所看到的:
   new Function(

        tmpl.arg + ',tmpl',

        "var _e=tmpl.encode" + tmpl.helper + ",_s='" +

        str.replace(tmpl.regexp, tmpl.func) +

        "';return _s;"

    );

当然我们还有其他方法。
Javascript 相关文章推荐
dojo 之基础篇(三)之向服务器发送数据
Mar 24 Javascript
小议javascript 设计模式 推荐
Oct 28 Javascript
两种简单实现菜单高亮显示的JS类代码
Jun 27 Javascript
js Array操作的最简短最容易理解方法
Dec 09 Javascript
JavaScript动态创建div等元素实例讲解
Jan 06 Javascript
jQuery ajax时间差导致的变量赋值问题分析
Jan 22 Javascript
利用VUE框架,实现列表分页功能示例代码
Jan 12 Javascript
Node.js创建HTTP文件服务器的使用示例
May 11 Javascript
jQuery实现的淡入淡出图片轮播效果示例
Aug 29 jQuery
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
Oct 31 Javascript
vue微信分享到朋友圈 vue微信发送给好友
Nov 28 Javascript
JS性能优化实现方法及优点进行
Aug 30 Javascript
JavaScript中的立即执行函数表达式介绍
Mar 15 #Javascript
Javascript中的arguments与重载介绍
Mar 15 #Javascript
JavaScript中的闭包介绍
Mar 15 #Javascript
Javascript中的匿名函数与封装介绍
Mar 15 #Javascript
Javascript中的方法链(Method Chaining)介绍
Mar 15 #Javascript
Javascript中的apply()方法浅析
Mar 15 #Javascript
Javascript中的Callback方法浅析
Mar 15 #Javascript
You might like
php读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
在php7中MongoDB实现模糊查询的方法详解
2017/05/03 PHP
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
Flask框架中密码的加盐哈希加密和验证功能的用法详解
2016/06/07 Python
Python操作csv文件实例详解
2017/07/31 Python
Python字符串和字典相关操作的实例详解
2017/09/23 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
python 画三维图像 曲面图和散点图的示例
2018/12/29 Python
Python @property使用方法解析
2019/09/17 Python
python实现广度优先搜索过程解析
2019/10/19 Python
Python数据可视化:顶级绘图库plotly详解
2019/12/07 Python
python获取网络图片方法及整理过程详解
2019/12/20 Python
python re模块和正则表达式
2021/03/24 Python
大学生党课思想汇报
2013/12/29 职场文书
安全责任书范本
2014/04/15 职场文书
维稳承诺书
2015/01/20 职场文书
公司表扬稿范文
2015/05/05 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
SQL之各种join小结详细讲解
2021/08/04 MySQL
Python列表的索引与切片
2022/04/07 Python
CSS中calc(100%-100px)不加空格不生效
2023/05/07 HTML / CSS