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 面向对象编程(2) 定义类
May 18 Javascript
js 绑定键盘鼠标事件示例代码
Feb 12 Javascript
用原生JS获取CLASS对象(很简单实用)
Oct 15 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
Aug 06 Javascript
js入门之Function函数的使用方法【新手必看】
Nov 22 Javascript
10道典型的JavaScript面试题
Mar 22 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
Dec 27 Javascript
dts文件中删除一个node或属性的操作方法
Aug 05 Javascript
vue 属性拦截实现双向绑定的实例代码
Oct 24 Javascript
angularjs通过过滤器返回超链接的方法
Oct 26 Javascript
原生js实现购物车
Sep 23 Javascript
uniapp微信小程序实现一个页面多个倒计时
Nov 01 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
2019十大人气国漫
2020/03/13 国漫
再次研究下cache_lite
2007/02/14 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
javascript数组去掉重复
2011/05/12 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
2015/06/30 Javascript
js实现防止被iframe的方法
2015/07/03 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
JavaScript实现图片自动加载的瀑布流效果
2016/04/11 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
JavaScript实现审核流程状态的动态显示进度条
2017/03/15 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
8 个有用的JS技巧(推荐)
2019/07/03 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
Python入门之后再看点什么好?
2018/03/05 Python
Django 路由系统URLconf的使用
2018/10/11 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
Pytorch GPU显存充足却显示out of memory的解决方式
2020/01/13 Python
基于Python脚本实现邮件报警功能
2020/05/20 Python
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
网络安全类面试题
2015/08/01 面试题
夏季奶茶店创业计划书
2014/01/16 职场文书
优秀毕业生自我鉴定
2014/01/19 职场文书
文明生主要事迹
2014/05/25 职场文书
建筑工地标语
2014/06/18 职场文书
小学校园广播稿集锦
2014/10/04 职场文书
2014年前台接待工作总结
2014/12/05 职场文书
法律进社区活动总结
2015/05/07 职场文书
行政申诉状范文
2015/05/20 职场文书
治理商业贿赂工作总结
2015/08/10 职场文书