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错误的认识不用关心内存管理
Dec 15 Javascript
JS中Iframe之间传值的方法
Mar 11 Javascript
jquery 定位input元素的几种方法小结
Jul 28 Javascript
javascript模拟实现C# String.format函数功能代码
Nov 25 Javascript
js数组的基本操作(很全自己整理的)
Oct 16 Javascript
JavaScript 模块化编程(笔记)
Apr 08 Javascript
JS实现可点击展开与关闭的左侧广告代码
Sep 02 Javascript
基于百度地图实现产品销售的单位位置查看功能设计与实现
Oct 21 Javascript
jquery与js实现全选功能的区别
Jun 11 jQuery
浅析Vue自定义组件的v-model
Nov 26 Javascript
vue实现消息的无缝滚动效果的示例代码
Dec 05 Javascript
JavaScript实现多文件下载方法解析
Aug 07 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如何获取Cookie并实现模拟登录
2020/07/16 PHP
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
2012/09/14 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
javascript使用avalon绑定实现checkbox全选
2015/05/06 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
Javascript 跨域知识详细介绍
2016/10/30 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
angularjs实现首页轮播图效果
2017/04/14 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
[01:10]DOTA2英雄背景故事第四期之混沌法则混沌骑士
2020/07/16 DOTA
详解python时间模块中的datetime模块
2016/01/13 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
python中的itertools的使用详解
2020/01/13 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
Python3爬虫mitmproxy的安装步骤
2020/07/29 Python
一波HTML5 Canvas基础绘图实例代码集合
2016/02/28 HTML / CSS
医药工作者的求职信范文
2013/09/21 职场文书
财务总监岗位职责
2014/03/07 职场文书
活动总结新闻稿
2014/08/30 职场文书
大学生见习报告总结
2014/11/04 职场文书
自我检讨书怎么写
2015/05/07 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
Python实现拼音转换
2021/06/07 Python
SQL SERVER触发器详解
2022/02/24 SQL Server
win10音频服务未响应怎么解决?win10音频服务未响应未修复的解决方法
2022/08/14 数码科技