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 data()如何存值
Aug 18 Javascript
自己编写的类似JS的trim方法
Oct 09 Javascript
jQuery截取指定长度字符串代码
Aug 21 Javascript
Jquery api 速查表分享
Jan 12 Javascript
基于jquery animate操作css样式属性小结
Nov 27 Javascript
Node.js+Express配置入门教程详解
May 19 Javascript
JS实现异步上传压缩图片
Apr 22 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
Aug 09 jQuery
VeeValidate在vue项目里表单校验应用案例
May 09 Javascript
Vue循环组件加validate多表单验证的实例
Sep 18 Javascript
Vue页面跳转动画效果的实现方法
Sep 23 Javascript
浅谈微信页面入口文件被缓存解决方案
Sep 29 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 array_search() 函数使用
2010/04/13 PHP
php操作SVN版本服务器类代码
2011/11/27 PHP
PHP分页详细讲解(有实例)
2013/10/30 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
smarty的section嵌套循环用法示例
2016/05/28 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
javascript实现删除前弹出确认框
2015/06/04 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
Python socket C/S结构的聊天室应用实现
2014/11/30 Python
python中input()与raw_input()的区别分析
2016/02/27 Python
Python编程实现二叉树及七种遍历方法详解
2017/06/02 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
Numpy之文件存取的示例代码
2018/08/03 Python
python三方库之requests的快速上手
2019/03/04 Python
python科学计算之narray对象用法
2019/11/25 Python
Python调用.NET库的方法步骤
2019/12/27 Python
快速查找Python安装路径方法
2020/02/06 Python
基于Python正确读取资源文件
2020/09/14 Python
python操作链表的示例代码
2020/09/27 Python
Shopee菲律宾:在线购买和出售
2019/11/25 全球购物
大学生求职中的自我评价
2013/10/01 职场文书
高级方案规划工程师岗位职责
2013/11/29 职场文书
大课间活动实施方案
2014/03/06 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
建筑工程专业大学生求职信
2014/04/23 职场文书
我们的节日中秋活动方案
2014/08/19 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
音乐课外活动总结
2015/05/09 职场文书
遗嘱格式范本
2015/08/07 职场文书
Memcached介绍及php-memcache扩展安装
2021/04/01 PHP
Python 实现定积分与二重定积分的操作
2021/05/26 Python
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫