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 相关文章推荐
javascript 动态设置已知select的option的value值的代码
Dec 16 Javascript
基于JavaScript 类的使用详解
May 07 Javascript
js中opener与parent的区别详细解析
Jan 14 Javascript
js实现简单选项卡与自动切换效果的方法
Apr 10 Javascript
纯js实现手风琴效果
Apr 17 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
May 17 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
Aug 24 Javascript
关于不同页面之间实现参数传递的几种方式讨论
Feb 13 Javascript
js拖动滑块和点击水波纹效果实例代码
Oct 16 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
Jan 19 Javascript
JavaScript箭头函数中的this详解
Jun 19 Javascript
vue实现下载文件流完整前后端代码
Nov 17 Vue.js
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
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
php str_pad 函数使用详解
2009/01/13 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
HTML node相关的一些资料整理
2010/01/01 Javascript
jquery EasyUI的formatter格式化函数代码
2011/01/12 Javascript
jQuery初学:find()方法及children方法的区别分析
2011/01/31 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
JS常用函数使用指南
2014/11/23 Javascript
浅谈JavaScript异常处理语句
2015/06/26 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
Node.js操作redis实现添加查询功能
2017/05/25 Javascript
Vue工程模板文件 webpack打包配置方法
2017/12/26 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
p5.js入门教程和基本形状绘制
2018/03/15 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
小程序api实现promise封装过程解析
2019/11/21 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
使用python开发vim插件及心得分享
2014/11/04 Python
python使用super()出现错误解决办法
2017/08/14 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
python爬虫中多线程的使用详解
2019/09/23 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
W Hamond官网:始于1979年的钻石专家
2020/07/20 全球购物
给全校老师的建议书
2014/03/13 职场文书
Java实现学生管理系统(IO版)
2022/02/24 Java/Android