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 相关文章推荐
关于COOKIE个数与大小的问题
Jan 17 Javascript
自己写了一个展开和收起的多更能型的js效果
Mar 05 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
Nov 18 Javascript
javascript:window.open弹出窗口的位置问题
Mar 18 Javascript
javascript if条件判断方法小结
May 17 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
Aug 19 Javascript
全面总结Javascript对数组对象的各种操作
Jan 22 Javascript
JS中使用 after 伪类清除浮动实例
Mar 01 Javascript
js 发布订阅模式的实例讲解
Sep 10 Javascript
React 实现拖拽功能的示例代码
Jan 06 Javascript
微信小程序利用for循环解决内容变更问题
Mar 05 Javascript
浅谈vue项目,访问路径#号的问题
Aug 14 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
改造一台复古桌面收音机
2021/03/02 无线电
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
js AspxButton的客户端操作
2009/06/26 Javascript
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
利用jQuery插件扩展识别浏览器内核与外壳的类型和版本的实现代码
2011/10/22 Javascript
你必须知道的Javascript知识点之"this指针"的应用
2013/04/23 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
2015/05/06 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
[51:17]Mski vs VGJ.S Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
简单谈谈python中的Queue与多进程
2016/08/25 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
Python3.6.x中内置函数总结及讲解
2019/02/22 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
python基于win32api实现键盘输入
2020/12/09 Python
html+css3实现的登录界面
2020/12/09 HTML / CSS
德国亚洲食品网上商店:asiafoodland.de
2019/12/28 全球购物
寻找迷宫的一条出路,o通路;X:障碍
2016/07/10 面试题
如何为DataGridView添加一个定制的Column Type
2014/01/21 面试题
自我评价是什么
2014/01/04 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
教师工作总结范文2014
2014/11/10 职场文书
党课主持词大全
2015/06/30 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书
PL350与SW11的比较
2021/04/22 无线电
如何用Navicat操作MySQL
2021/05/12 MySQL
如何利用python实现列表嵌套字典取值
2022/06/10 Python