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编程起步(第四课)
Feb 27 Javascript
js动态修改input输入框的type属性(实现方法解析)
Nov 13 Javascript
js中arguments的用法(实例讲解)
Nov 30 Javascript
javascript快速排序算法详解
Sep 17 Javascript
javascript引用类型指针的工作方式
Apr 13 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
Sep 01 Javascript
jQuery 获取页面li数组并删除不在数组中的key
Aug 02 Javascript
js制作可以延时消失的菜单
Jan 13 Javascript
angular内置provider之$compileProvider详解
Sep 27 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
Sep 11 Javascript
TypeScript高级用法的知识点汇总
Dec 17 Javascript
js动态添加带圆圈序号列表的实例代码
Feb 18 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
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
2019/09/16 PHP
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
JS Loading功能的简单实现
2013/11/29 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
Three.js实现浏览器变动时进行自适应的方法
2017/09/26 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
2020/02/11 Javascript
基于Python实现一个简单的银行转账操作
2016/03/06 Python
python文本数据相似度的度量
2018/03/12 Python
Flask框架实现给视图函数增加装饰器操作示例
2018/07/16 Python
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
前台接待的工作职责
2013/11/21 职场文书
上课说话检讨书大全
2014/01/22 职场文书
师生聚会感言
2014/01/26 职场文书
2014年中班元旦活动方案
2014/02/14 职场文书
公司委托书格式范文
2014/04/04 职场文书
网络编辑求职信
2014/04/30 职场文书
2014年纪委工作总结
2014/12/05 职场文书
2015年世界水日活动总结
2015/02/09 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
开业庆典致辞
2015/08/01 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
2016年乡镇综治宣传月活动总结
2016/03/16 职场文书
2016年社区文体活动总结
2016/04/06 职场文书
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS