提高javascript效率 一次判断,而不要次次判断


Posted in Javascript onMarch 30, 2012

判断嘛,就是面临2个或以上的选项时进行选择。比如我家门前去公司有一个岔路,只要我第一次知道了哪一条路是对的,那我下一次或以后的每次都不用再思考了,直接走那条路即可——当然,突发天灾时不算。
做出判断是需要时间的,是需要对应条件的。正确的判断很好,但每次面临岔路,哪怕是走了无数次的岔路,都来进行一下判断,无疑是一种脑残行为。

下面来看一个我们平时经常看到的JS函数,他的作用是判断浏览器类型然后设置对应的透明度属性:

function setAlpha(obj,alpha){ 
if (-[1,]) obj.style.opacity = alpha / 100; 
else obj.style.filter = "alpha(opacity=" + alpha + ")"; 
}

这个函数有错吗?没有。先判断浏览器是否是标准浏览器,如果是,就直接通过opacity设置透明;如果不是,则使用IE滤镜来实现透明度。

逻辑清晰,代码简练,精品啊!

不过,没有错误,却有失误。

通常,这种设置透明度的函数都会用来制作淡入淡出效果,也就是说它会被setTimeout一次次的调用,直到循环结束。

这时候问题就来了。回到前面的岔路问题,这个函数就相当于,每次来到路口,都要思考判断。第1次,来到路口,骚等,我看看,噢,是firefox啊,走第1条路;第2次,又来到这路口,等等,我看看,噢,又是firefox啊,还走第1条路……第3次……第4次。。。。不管多少次,这个函数都会像最敬业的交警一样来查看你的身份————你,不烦吗?你不烦我都烦了!

这时候,如果你是过路的,你肯定希望这个交警消失。

其实,遇到岔路我们可以这样:既然已经知道只走一条路,那我干脆把另外的路给堵死算了!当然在现实生活中不可能这样做,不过在代码里却不难实现,换个思路即可。

javascript有个神奇的地方,就是匿名函数(通常用来自执行),自执行函数的意思是呢,他声明的时候就执行掉了,以后就不会再出现了,你想找都不定能找到!个人觉得,这个性不错。

看下面的代码,同样是设置透明度的函数:

var setAlpha = (function(obj,alpha){ 
var set; 
if (-[1,]) { 
set = function (obj,alpha) { 
obj.style.opacity = alpha * 0.01; 
} 
} 
else { 
set = function(obj,alpha){ 
obj.style.filter = "alpha(opacity=" + alpha + ")"; 
} 
} 
return set; 
})()

也许你要不满了:这是什么玩意儿啊,好像初学者的水平(被你看穿了。。。)但是!这个却比前面的版本效率高很多。不信你可以在firefox和ie6下分别alert一下这个函数,就明白了。

通过自执行函数,当声明setAlpha的时候就执行了函数,而这个函数的作用就是,判断浏览器,并确定该使用哪种设置透明度的方法。由于浏览器的类型在打开页面后就不可能再变化,也就是以后都不用再判断了。就算你调用10万次这个函数,他也不会再判断,而是直接执行。

虽然代码丑,但境界就不同了…

这个例子只是一个小小示范,我只是希望你能明白【一次判断,而不要次次判断】的道理,并发扬光大。减少判断次数,对js的效率是一个很大的提高。
转自:jo2.org

Javascript 相关文章推荐
firefo xml 读写实现js代码
Jun 11 Javascript
jQuery中的val()示例应用
Feb 26 Javascript
JavaScript实现把数字转换成中文
Jun 29 Javascript
分享jQuery插件的学习笔记
Jan 14 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
Oct 27 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
May 02 Javascript
AngularJS实现图片上传和预览功能的方法分析
Nov 08 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
May 22 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
Sep 27 Javascript
深入浅析javascript函数中with
Oct 28 Javascript
vue双向绑定数据限制长度的方法
Nov 04 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
Jun 16 Javascript
一个关于javascript匿名函数的问题分析
Mar 30 #Javascript
JavaScript 基础篇(一)
Mar 30 #Javascript
js确定对象类型方法
Mar 30 #Javascript
js 浏览器事件介绍
Mar 30 #Javascript
js中eval详解
Mar 30 #Javascript
关于jquery性能最佳实践的讨论,与求教
Mar 30 #Javascript
从面试题学习Javascript 面向对象(创建对象)
Mar 30 #Javascript
You might like
多人战的战术与战略
2020/03/04 星际争霸
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
菜鸟javascript基础整理1
2010/12/06 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
Javascript中自动切换焦点实现代码
2012/12/15 Javascript
jQuery取得设置清空select选择的文本与值
2014/07/08 Javascript
JavaScript使用focus()设置焦点失败的解决方法
2014/09/03 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
jQuery解决浏览器兼容性问题案例分析
2016/04/15 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
2016/07/07 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
vue购物车插件编写代码
2017/11/27 Javascript
vue 音乐App QQ音乐搜索列表最新接口跨域设置方法
2018/09/25 Javascript
浅析vue-router原理
2018/10/19 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
2018/11/25 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
typescript nodejs 依赖注入实现方法代码详解
2019/07/21 NodeJs
Vuex实现简单购物车
2021/01/10 Vue.js
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
以windows service方式运行Python程序的方法
2015/06/03 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
Python如何访问字符串中的值
2020/02/09 Python
纽约州一群才华横溢的金匠制作而成:Hearth Jewelry
2019/03/22 全球购物
竞聘演讲稿范文
2014/01/12 职场文书
旷课检讨书2000字
2014/01/14 职场文书
应用英语专业自荐信
2014/01/26 职场文书
小学评语大全
2014/04/22 职场文书
食品流通安全承诺书
2014/05/22 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
收款授权委托书
2014/10/02 职场文书
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python