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 流畅动画实现原理
Sep 08 Javascript
jQuery UI 应用不同Theme的办法
Sep 12 Javascript
JavaScript 参数中的数组展开 [译]
Sep 21 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
Jan 23 Javascript
jquery实现鼠标滑过显示提示框的方法
Feb 05 Javascript
JavaScript的removeChild()函数用法详解
Dec 27 Javascript
jquery 抽奖小程序实现代码
Oct 12 Javascript
js实现3D图片环展示效果
Mar 09 Javascript
Vue Ajax跨域请求实例详解
Jun 20 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
Sep 30 Javascript
详解Jest结合Vue-test-utils使用的初步实践
Jun 27 Javascript
JS实现盒子拖拽效果
Feb 06 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
一个查看session内容的函数
2006/10/09 PHP
php编程实现获取excel文档内容的代码实例
2011/06/28 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
php之可变函数的实例详解
2017/09/13 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
Vue中遍历数组的新方法实例详解
2019/07/21 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
python求解水仙花数的方法
2015/05/11 Python
Python函数的周期性执行实现方法
2016/08/13 Python
深入探究Django中的Session与Cookie
2017/07/30 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
python安装和pycharm环境搭建设置方法
2020/05/27 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
python实现三壶谜题的示例详解
2020/11/02 Python
Python获取指定网段正在使用的IP
2020/12/14 Python
网络艺术零售业的先驱者:artrepublic
2017/09/26 全球购物
介绍下Java中==和equals的区别
2013/09/01 面试题
2014年父亲节活动方案
2014/03/06 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
导游词之扬州大明寺
2019/10/09 职场文书