JavaScript小技巧 2.5 则


Posted in Javascript onSeptember 12, 2010

在前一篇博文中我介绍了一种可以让JavaScript多少具备一点类似Lambda表达式的编程能力的办法,但是由于要兼容于JavaScript的语法检查,所以可以使用的场合也很有限。

不过有些比较细心的朋友可能发现了,我在那个(伪)Lambda模块中使用了几个小技巧,现在我就把这几个小技巧介绍一下:

1、使用new Function来进行语法检查。

尝试写框架的同学们一定对此感受颇深:有的时候通过代码产生的代码可能因为技术上的失误而产语法错误,导致运行过程中异常中断;有的时候需要接受用户的输入,但用户可能有意或者无意地写入有误的语句或表达式。
有些同学为了解决这种问题特意去编写(或者使用现成的)复杂的语法检查过程——但编写用来分析代码语法的代码是一件极其痛苦的事情,一旦发现问题调整起来也非常不方便。
其实这个问题有简单一点的解决办法,就是使用脚本引擎自己的语法检查,比方说eval或者new Function——当然这个eval是不能乱用的,在不适当的时候用了eval的话整个程序都会出问题的;而new Function就没这么大问题——虽然说new Function在任何情况下构造的函数都是在全局作用域下直接工作的,但只是语法检查的话并不会因为作用域问题而产生意外结果,只要你不真的直接调用通过它构造的新函数。

2、在eval接受的参数前面增加“0,”。

其实这是由于IE中存在一个BUG。

出于某种神奇的原因,如果你在IE中想通过调用eval来动态地构造一个函数的话,如果只是在函数的表达式两边增加括号——例如:

eval('(function(){ /* code here */ })');

得到的返回也仍然是undefined,而其它浏览器则会正确地返回这个新构造的函数的引用。
经过小小的探索之后,我发现最简单有效的解决问题的办法就是在前边加上“0,” ,这样就在所有(或者说,至少是现在的五大主流)浏览器中都能得到预期结果了。

eval('0,function(){ /* code here */ }');

注:在IE9的Chakra引擎中这个问题已经解决了~

3、使用数组对象的concat方法来产生新数组。

认真的说这个应该属于JavaScript的常识,毕竟这个方法的用法在任何一个JavaScript语言功能参考上都能找到。
但是可能有些同学总是想不起来什么时候可以用它。
在我的(伪) Lambda模块中,我很无聊地编写了一个可以把一个引用/值以多种别名同时附加在多个对象上的函数,这个函数既可以接受一个对象作为参数,也可以接受包含一系列对象的数组作为参数。
由于这个函数被调用的次数比较少,所以我决定用(不一定效率最好,但)简单有效的办法来适应两种情况,也就是把单个对象参数转化为只包含一个元素的数组再来处理,我选择了用“[].concat(o)”的形式。
如果你有阅读我的代码,你可能会发现注释中还包含了另一种方式,也就是“if (!(o instanceof Array)) o = [o]” ——后来我想了想,觉得一来不够严谨(和ECMAScript 5中的isArray相比),二来调用的次数比较少,性能提升也很有限,就选择了前一种。
在阅读本文的同学们,你们有没有什么有趣的技巧可以分享给大家呢?

Javascript 相关文章推荐
几个比较实用的JavaScript 测试及效验工具
Apr 18 Javascript
jQuery中的bind绑定事件与文本框改变事件的临时解决方法
Aug 13 Javascript
疯狂Jquery第一天(Jquery学习笔记)
May 11 Javascript
JS获取当前日期时间并定时刷新示例
Mar 04 Javascript
简介JavaScript中search()方法的使用
Jun 06 Javascript
基于JavaScript代码实现微信扫一扫下载APP
Dec 30 Javascript
简单掌握JavaScript中const声明常量与变量的用法
May 21 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
Jul 28 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
Nov 21 Javascript
Vue用v-for给src属性赋值的方法
Mar 03 Javascript
微信小程序http连接访问解决方案的示例
Nov 05 Javascript
微信小程序页面缩放式侧滑效果的实现代码
Nov 15 Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
Sep 12 #Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
Sep 12 #Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
Sep 12 #Javascript
Asp.net下利用Jquery Ajax实现用户注册检测(验证用户名是否存)
Sep 12 #Javascript
jQuery EasyUI 的EasyLoader功能介绍
Sep 12 #Javascript
jQuery UI 应用不同Theme的办法
Sep 12 #Javascript
基于jquery的表格排序
Sep 11 #Javascript
You might like
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
ie下动态加态js文件的方法
2011/09/13 Javascript
Javascript页面添加到收藏夹的简单方法
2013/08/07 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
js获取指定时间的前几秒
2017/04/05 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
在vue-cli中组件通信的方法
2017/12/16 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
2018/12/11 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
基于layui的下拉列表的数据回显方法
2019/09/24 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
ant design vue导航菜单与路由配置操作
2020/10/28 Javascript
[50:38]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第二场 3月7日
2021/03/11 DOTA
python实现倒计时的示例
2014/02/14 Python
用python写的一个wordpress的采集程序
2016/02/27 Python
Python实现发送QQ邮件的封装
2017/07/14 Python
Python多进程multiprocessing用法实例分析
2017/08/18 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
python网络爬虫学习笔记(1)
2018/04/09 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
python tkinter窗口最大化的实现
2019/07/15 Python
python字符串格式化方式解析
2019/10/19 Python
python获取响应某个字段值的3种实现方法
2020/04/30 Python
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
JACK & JONES荷兰官网:男士服装和鞋子
2021/03/07 全球购物
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
航空大学应届生求职信
2013/11/10 职场文书
迎接领导欢迎词
2014/01/11 职场文书
2014组织生活会方案
2014/05/19 职场文书
农村优秀教师事迹材料
2014/08/27 职场文书
营销总监岗位职责
2014/09/16 职场文书
2014教师年度工作总结
2014/11/10 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书