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 轻松支持函数重载 (Part 1 - 设计)
Aug 04 Javascript
jquery实现input输入框实时输入触发事件代码
Jan 28 Javascript
Extjs根据条件设置表格某行背景色示例
Jul 23 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
Sep 04 Javascript
validationEngine 表单验证插件使用实例代码
Jun 15 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
Jul 19 Javascript
angularjs 动态从后台获取下拉框的值方法
Aug 13 Javascript
Vuejs 实现简易 todoList 功能 与 组件实例代码
Sep 10 Javascript
vue axios post发送复杂对象问题
Jun 04 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
Nov 10 Javascript
js实现九宫格布局效果
May 28 Javascript
前端框架ECharts dataset对数据可视化的高级管理
Dec 24 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
Apache设置虚拟WEB
2006/10/09 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
2016/12/23 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
40款非常棒的jQuery 插件和制作教程(系列二)
2011/11/02 Javascript
JavaScript实现同一页面内两个表单互相传值的方法
2015/08/12 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
js实现遍历含有input的table实例
2015/12/07 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
2016/12/19 Javascript
原生js的ajax和解决跨域的jsonp(实例讲解)
2017/10/16 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
原生js实现的金山打字小游戏(实例代码详解)
2020/03/16 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
2020/06/23 Javascript
在vue中created、mounted等方法使用小结
2020/07/21 Javascript
python处理文本文件并生成指定格式的文件
2014/07/31 Python
Python线程中对join方法的运用的教程
2015/04/09 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
2018/02/24 Python
transform python环境快速配置方法
2018/09/27 Python
django框架实现一次性上传多个文件功能示例【批量上传】
2019/06/19 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
你所在的项目是如何确定版本号的
2015/12/28 面试题
女大学生个人求职信
2013/12/09 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
施工安全标语
2014/06/07 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
人身意外保险授权委托书
2014/10/01 职场文书
电子银行业务授权委托书
2014/10/10 职场文书
办公用品管理制度
2015/08/04 职场文书
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python