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中文乱码的多种解决方法
Jun 21 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
Nov 12 Javascript
Javascript字符串常用方法详解
Jul 21 Javascript
Node.js 异步异常的处理与domain模块解析
May 10 Javascript
JavaScript中document.referrer的用法详解
Jul 04 Javascript
JavaScript实现的浏览器下载文件的方法
Aug 09 Javascript
基于Cookie常用操作以及属性介绍
Sep 07 Javascript
Thinkjs3新手入门之如何使用静态资源目录
Dec 06 Javascript
JS实现图片旋转动画效果封装与使用示例
Jul 09 Javascript
angular4应用中输入的最小值和最大值的方法
May 17 Javascript
浅谈layui分页控件field参数接收对象的问题
Sep 20 Javascript
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 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
3.从实例开始
2006/10/09 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
JavaScript 面向对象之命名空间
2010/05/04 Javascript
JS 实现导航栏悬停效果(续2)
2013/09/24 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
Vue中"This dependency was not found"问题的解决方法
2018/06/19 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
JavaScript遍历数组的方法代码实例
2020/01/14 Javascript
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
python的dict,set,list,tuple应用详解
2014/07/24 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
Python表示矩阵的方法分析
2017/05/26 Python
python批量替换页眉页脚实例代码
2018/01/22 Python
python面试题小结附答案实例代码
2019/04/11 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
Python是什么 Python的用处
2020/05/26 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
就业协议书怎么填
2014/04/11 职场文书
读书之星事迹材料
2014/05/12 职场文书
村容村貌整治方案
2014/05/21 职场文书
质量提升方案
2014/06/16 职场文书
三好学生事迹材料
2014/12/24 职场文书
会计工作检讨书
2015/02/19 职场文书
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android
python读取mnist数据集方法案例详解
2021/09/04 Python
德劲DE1107指针试高灵敏度全波段收音机机评
2022/04/05 无线电