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 相关文章推荐
jQuery select的操作实现代码
May 06 Javascript
JavaScript 异步调用框架 (Part 4 - 链式调用)
Aug 04 Javascript
JavaScript是否可实现多线程  深入理解JavaScript定时机制
Dec 22 Javascript
js onmousewheel事件多次触发问题解决方法
Oct 17 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
Jan 13 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
Jul 29 Javascript
jQuery超简单选项卡完整实例
Sep 26 Javascript
Angularjs为ng-click事件传递参数
Jun 15 Javascript
vue实现全选、反选功能
Nov 17 Javascript
深入浅析Vue不同场景下组件间的数据交流
Aug 15 Javascript
vue使用jsonp抓取qq音乐数据的方法
Jun 21 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
Nov 10 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
数字转英文
2006/12/06 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
表单提交验证类
2006/07/14 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
javascript中的startWith和endWith的几种实现方法
2013/05/07 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
javascript中cookie对象用法实例分析
2015/01/30 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
基于node.js实现微信支付退款功能
2017/12/19 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
nodejs读取并去重excel文件
2018/04/22 NodeJs
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
详解微信JS-SDK选择图片遇到的坑
2018/08/15 Javascript
在Vue环境下利用worker运行interval计时器的步骤
2019/08/01 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
wxpython学习笔记(推荐查看)
2014/06/09 Python
Python编程实现删除VC临时文件及Debug目录的方法
2017/03/22 Python
PYQT5实现控制台显示功能的方法
2019/06/25 Python
vue常用指令代码实例总结
2020/03/16 Python
给Django Admin添加验证码和多次登录尝试限制的实现
2020/07/26 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
日语专业个人的求职信
2013/12/03 职场文书
军训生自我鉴定范文
2013/12/27 职场文书
趣味运动会活动方案
2014/02/12 职场文书
2014年小学元旦活动方案
2014/02/12 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
公司离职证明标准范本
2014/10/05 职场文书
债务追讨律师函
2015/06/24 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
Python异常类型以及处理方法汇总
2021/06/05 Python