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 相关文章推荐
由prototype_1.3.1进入javascript殿堂-类的初探
Nov 06 Javascript
简单实用的全选反选按钮例子
Oct 18 Javascript
window resize和scroll事件的基本优化思路
Apr 29 Javascript
轻松实现javascript图片轮播特效
Jan 13 Javascript
遍历js中对象的属性和值的实例
Nov 21 Javascript
jQuery EasyUI 页面加载等待及页面等待层
Feb 06 Javascript
Angular.JS中指令ng-if的注意事项小结
Jun 21 Javascript
详谈js对url进行编码和解码(三种方式的区别)
Aug 16 Javascript
jQuery实现判断上传图片类型和大小的方法示例
Apr 11 jQuery
微信小程序 如何获取网络状态
Jul 26 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
Aug 22 Javascript
从零使用TypeScript开发项目打包发布到npm
Feb 14 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
JavaScript中的事件处理
2008/01/16 Javascript
javascript 三种编解码方式
2010/02/01 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
javascript hasFocus使用实例
2010/06/29 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
2016/01/28 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
js实现日历
2020/11/07 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
[01:02:26]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第二场 1月18日
2021/03/11 DOTA
Python使用MD5加密字符串示例
2014/08/22 Python
python实现文本文件合并
2015/12/29 Python
python实现类之间的方法互相调用
2018/04/29 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
如何表示python中的相对路径
2020/07/08 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
大学自主招生推荐信
2014/05/10 职场文书
委托书的格式
2014/08/01 职场文书
初中学校对照检查材料
2014/08/19 职场文书
护士求职自荐信
2015/03/25 职场文书
青年志愿者服务活动总结
2015/05/06 职场文书
中国合伙人观后感
2015/06/02 职场文书
团结友爱主题班会
2015/08/13 职场文书
详解用Python把PDF转为Word方法总结
2021/04/27 Python
浅谈Redis存储数据类型及存取值方法
2021/05/08 Redis
分享CSS盒子模型隐藏的几种方式
2022/02/28 HTML / CSS