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 EasyUI API 中文文档 - Tree树使用介绍
Nov 19 Javascript
jQuery的slideToggle方法实例
May 07 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
Oct 21 Javascript
在Node.js中使用HTTP上传文件的方法
Jun 23 Javascript
jQuery实现判断滚动条到底部
Jun 23 Javascript
JS+CSS实现仿msn风格选项卡效果代码
Oct 22 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
May 07 Javascript
详解JS去重及字符串奇数位小写转大写
Dec 29 Javascript
js中url对象化管理分析
Dec 29 Javascript
JS常见内存泄漏及解决方案解析
May 30 Javascript
微信小程序的引导页实现代码
Jun 24 Javascript
vue el-table实现递归嵌套的示例代码
Aug 14 Vue.js
让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 has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
PHP的范围解析操作符(::)的含义分析说明
2011/07/03 PHP
php汉字转拼音的示例
2014/02/27 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
2014/07/05 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
jQuery Validation插件remote验证方式的Bug解决
2010/07/01 Javascript
JavaScript获取文本框内选中文本的方法
2015/02/20 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
在python中的socket模块使用代理实例
2014/05/29 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
2017/11/01 Python
python 矩阵增加一行或一列的实例
2018/04/04 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
使用Python构造hive insert语句说明
2020/06/06 Python
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
Space NK英国站:英国热门美妆网站
2017/12/11 全球购物
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
前厅收银主管岗位职责
2014/02/04 职场文书
公司活动总结范文
2014/07/01 职场文书
工作失职检讨书500字
2014/10/17 职场文书
社区文明倡议书
2015/04/28 职场文书
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle
MySQL 语句执行顺序举例解析
2022/06/05 MySQL