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-$.extend扩展方法使方法参数更灵活
Jan 15 Javascript
js多功能分页组件layPage使用方法详解
May 19 Javascript
js实现微博发布小功能
Jan 12 Javascript
jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例
Oct 19 jQuery
vue 实现边输入边搜索功能的实例讲解
Sep 16 Javascript
css配合JavaScript实现tab标签切换效果
Oct 11 Javascript
微信小程序template模板与component组件的区别和使用详解
May 22 Javascript
Vue的属性、方法、生命周期实例代码详解
Sep 17 Javascript
JS通过识别id、value值对checkbox设置选中状态
Feb 19 Javascript
利用 JavaScript 实现并发控制的示例代码
Dec 31 Javascript
vue使用echarts画组织结构图
Feb 06 Vue.js
javascript实现固定侧边栏
Feb 09 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操作Redis常用技巧总结
2018/04/24 PHP
javascript 主动派发事件总结
2011/08/09 Javascript
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
NODE.JS加密模块CRYPTO常用方法介绍
2014/06/05 Javascript
Node.js实现简单聊天服务器
2014/06/20 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
基于BootStarp的Dailog
2016/04/28 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
WEB 前端开发中防治重复提交的实现方法
2016/10/26 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
2020/11/17 Vue.js
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
python list中append()与extend()用法分享
2013/03/24 Python
使用Python实现下载网易云音乐的高清MV
2015/03/16 Python
Python写的一个简单监控系统
2015/06/19 Python
Python构造自定义方法来美化字典结构输出的示例
2016/06/16 Python
Python按行读取文件的简单实现方法
2016/06/22 Python
用matplotlib画等高线图详解
2017/12/14 Python
Python callable()函数用法实例分析
2018/03/17 Python
用Python逐行分析文件方法
2019/01/28 Python
Python的Lambda函数用法详解
2019/09/03 Python
python图片合成的示例
2020/11/09 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
商场经理竞聘演讲稿
2014/01/01 职场文书
大气污染防治方案
2014/05/19 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
python状态机transitions库详解
2021/06/02 Python
学习nginx基础知识
2021/09/04 Servers