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 相关文章推荐
jquery div拖动效果示例代码
Dec 08 Javascript
jquery+easeing实现仿flash的载入动画
Mar 10 Javascript
深入理解JavaScript编程中的原型概念
Jun 25 Javascript
jquery通过name属性取值的简单实现方法
Jun 20 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
Nov 03 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
Dec 27 Javascript
ES6中module模块化开发实例浅析
Apr 06 Javascript
老生常谈js-react组件生命周期
May 02 Javascript
Vue.js实现图片的随意拖动方法
Mar 08 Javascript
vue-cli项目修改文件热重载失效的解决方法
Sep 19 Javascript
JavaScript 严格模式(use strict)用法实例分析
Mar 04 Javascript
JS前端基于canvas给图片添加水印
Nov 11 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
中国第一家无线电行
2021/03/01 无线电
php写的AES加密解密类分享
2014/06/20 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
php注册登录系统简化版
2020/12/28 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
Ext JS 4实现带week(星期)的日期选择控件(实战二)
2013/08/21 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
微信开发 JS-SDK 6.0.2 经常遇到问题总结
2016/12/08 Javascript
echart简介_动力节点Java学院整理
2017/08/11 Javascript
Python入门学习之字符串与比较运算符
2015/10/12 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
CAT鞋英国官网:坚固耐用的靴子和鞋
2016/10/21 全球购物
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
次世代生活态度:Hypebeast
2018/07/05 全球购物
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
Collection和Collections的区别
2016/05/02 面试题
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
新教师工作感言
2014/02/16 职场文书
高中生职业规划范文
2014/03/09 职场文书
服务理念标语
2014/06/18 职场文书
社团活动总结模板
2014/06/30 职场文书
村党支部群众路线教育实践活动对照检查材料
2014/09/26 职场文书
小学生优秀评语
2014/12/29 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
配置nginx负载均衡
2022/05/06 Servers