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 相关文章推荐
js中判断Object、Array、Function等引用类型对象是否相等
Aug 29 Javascript
javascript中数组的sort()方法的使用介绍
Dec 18 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
Feb 13 Javascript
JavaScript实现动态删除列表框值的方法
Aug 12 Javascript
js转html实体的方法
Sep 27 Javascript
JS代码实现百度地图 画圆 删除标注
Oct 12 Javascript
Bootstrap导航条的使用和理解3
Dec 14 Javascript
js Canvas实现的日历时钟案例分享
Dec 25 Javascript
JavaScript面向对象精要(下部)
Sep 12 Javascript
JavaScript跳出循环的三种方法(break, return, continue)
Jul 30 Javascript
layui 富文本编辑器和textarea值的相互传递方法
Sep 18 Javascript
微信小程序实现音乐播放页面布局
Dec 11 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实现获取文件mime类型的方法
2015/02/11 PHP
php array_merge函数使用需要注意的一个问题
2015/03/30 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
Javascript排序算法之计数排序的实例
2014/04/05 Javascript
JS实现控制表格内指定单元格内容对齐的方法
2015/03/30 Javascript
详谈LABJS按需动态加载js文件
2015/05/07 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
Angular.JS中的this指向详解
2017/05/17 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
Python实现股市信息下载的方法
2015/06/15 Python
python通过socket查询whois的方法
2015/07/18 Python
Python基础中所出现的异常报错总结
2016/11/19 Python
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
Python tkinter和exe打包的方法
2020/02/05 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
全球最大运动品牌的男装、女装和童装官方库存商:A&A Sports
2021/01/17 全球购物
工程质量保证书
2015/05/09 职场文书
学习焦裕禄观后感
2015/06/09 职场文书
党员读书活动心得体会
2016/01/14 职场文书
关于应聘教师的自荐信
2016/01/28 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
创业者如何撰写出一份打动投资人的商业计划书?
2019/07/02 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书