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+Jq获取URL参数的集中方法示例代码
May 20 Javascript
Jquery easyui 实现动态树
Nov 17 Javascript
基于jQuery仿淘宝产品图片放大镜特效
Oct 19 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
May 05 Javascript
pc加载更多功能和移动端下拉刷新加载数据
Nov 07 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
Dec 26 Javascript
使用vue.js写一个tab选项卡效果
Mar 25 Javascript
ES6中的rest参数与扩展运算符详解
Jul 18 Javascript
详解浏览器缓存和webpack缓存配置
Jul 06 Javascript
layer.alert回调函数执行关闭弹窗的实例
Sep 11 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
Oct 10 jQuery
vue前端工程的搭建
Mar 31 Vue.js
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连接oracle数据库及查询数据的方法
2014/12/29 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
Jquery中对数组的操作代码
2011/08/12 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
js完美解决IE6不支持position:fixed的bug
2015/04/24 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
js中判断变量类型函数typeof的用法总结
2016/08/09 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
vue2.0之多页面的开发的示例
2018/01/30 Javascript
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
解决vue-router中的query动态传参问题
2018/03/20 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
2019/09/13 Javascript
python通过colorama模块在控制台输出彩色文字的方法
2015/03/19 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
python调用外部程序的实操步骤
2019/03/04 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
对Python 字典元素进行删除的方法
2020/07/31 Python
Python中logger日志模块详解
2020/08/04 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
2021/02/06 Python
Clarks鞋美国官网:全球领军鞋履品牌
2017/05/13 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
秦兵马俑教学反思
2014/02/07 职场文书
协议书格式
2014/04/23 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
多媒体教室标语
2014/06/26 职场文书
战略合作意向书
2014/07/29 职场文书
公司出纳岗位职责
2015/03/31 职场文书
导游词之镇江焦山
2019/11/21 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android