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正确获取元素样式详解
Aug 07 Javascript
Javascript 检测、添加、移除样式(className)函数代码
Sep 08 Javascript
asp.net HttpHandler实现图片防盗链
Nov 09 Javascript
JS面向对象编程 for Cookie
Sep 19 Javascript
YUI模块开发原理详解
Nov 18 Javascript
jquery图片轮播插件仿支付宝2013版全屏图片幻灯片
Apr 03 Javascript
javascript实现简单的省市区三级联动
May 14 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
Jul 12 Javascript
详解JavaScript数组过滤相同元素的5种方法
May 23 Javascript
React Native之TextInput组件解析示例
Aug 22 Javascript
JS基于递归实现网页版计算器的方法分析
Dec 20 Javascript
Vue精简版风格指南(推荐)
Jan 30 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
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
PHP模块memcached使用指南
2014/12/08 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
Javascript调用XML制作连动下拉列表框
2006/06/25 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
使用jquery+CSS实现控制打印样式
2014/12/31 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
javaScript中定义类或对象的五种方式总结
2016/12/04 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
Python使用代理抓取网站图片(多线程)
2014/03/14 Python
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
Python通过poll实现异步IO的方法
2015/06/04 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
Python实现分段线性插值
2018/12/17 Python
浅析python中while循环和for循环
2019/11/19 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
让IE6支持css3,让 IE7、IE8 都支持CSS3
2011/10/09 HTML / CSS
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
应聘自荐信
2013/12/14 职场文书
2014年圣诞节寄语
2014/12/08 职场文书
小数乘法教学反思
2016/02/22 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript
GPU服务器的多用户配置方法
2022/07/07 Servers