Javascript高级技巧分享


Posted in Javascript onFebruary 25, 2014

上次整理了Ajax部分,这周看完了高级技巧部分,也整理下吧。

1、类型检测
使用Object.prototype.toString.call(obj)的方式。
因为无论typeof还是instanceof都无法做到精确判断变量类型。

2、安全的构造函数
通常我们定义构造函数的时候,会使用类似

function Person(name){
this.name = name;
}

然而之后如果不是去 var person = new Person("cnblogs")。
而是 var person = Person("cnblogs")。那么this就会指向别处,导致污染其余对象。
解决方法就是在设置this.property的时候判断
this instanceof Person
如果不是,则new Person(x,x,x);
function Person(name){
      if(this instanceof Person){
     this.name = name;
      }else{
          return new Person(name);
      }
}

但是要注意一点,如果其余构造函数试图通过Person.call(this,x)这种方式实现继承的时候。
需要注意,在实例化之前把那个函数的原型指向到Person去。

3、惰性载入函数
在调用函数时,经常会存在一种情况,就是函数中需要对浏览器功能进行判断。
例如

function createSomething(){
     if(supportH5){
          //do something
     }else{
          //do otherthing
     }
}

但是,如果一个浏览器支持一个功能,那么必然是一直都支持,所以这里面每次执行代码时都去判断是不必要的,因为判断一次就够了。
所以可以改写成
function createSomething(){
     if(supportH5){
          createSomething = function(){ //重写了createSomething 函数
               //do something
          }
     }else{
          //同上
     }
}

这样,第一次调用时会做判断,之后重写了这个函数,也就自然不会判断了。

 
4、函数绑定
在js中,最搞混的应该就是 this 指向谁的问题。
其实,在我学习js这么久的时间里,发现一个结论
在函数中的this会指向最终调用这个函数的对象,换句话说就是,哪个对象调用了这个函数,this就指向那个对象。
搞清楚了这个,函数绑定就不是问题了。
改变函数里面this指向的方法就是 call 和 apply,不过用这两个方法都会执行函数。
如果不想执行函数,而是把函数当参数传给某个函数,还想改变this,那么就用最新的bind。

 
5、定时器
setTimeou、setInterval或者Ajax等虽然是异步,像多线程一样,但是js是单线程的。
其实这些方法并没有增加一个线程。
setTimeout(fn,300)代表的意思是300毫秒后把fn放入js的执行队列里面。
如果这是队列里面没有事务要执行(也就是说js解释器处于空闲状态),那么便会立刻执行。否则,便会等队列的事务处理完再执行这个函数。
所以,用setTimeout或者setInterval都不是准确的控制时间。
还有一点要注意的就是,使用setTimeout模拟setInterval可以准确控制最小执行时间间隔。

 
6、使用定时器固定时间执行方法。
如果一个方法要执行很久,也许造成浏览器短时间没响应,那么可以用定时器固定每段时间执行一部分。这样可以不至于让js一直处于忙碌状态(浏览器无响应),有空闲的时间处理其余事务。比如有一个1000长度数组循环,那么可以100每次的执行,中间隔点时间让js处于空闲去做别的操作。

 
7、函数节流。
函数节流是一种提高性能很好的方式,在某些场合可以提高几倍效率。
比如在做拖动或者是一些发生在onresize事件中的操作时。
你每操作一下,其实执行了很多遍了。例如:

var i = 0;
window.onresize = function(){
    console.log(i++);
}

尝试着去拉伸浏览器,就会发现控制台瞬间显示i都超过100多了。
改变一下写法,例如:

var i = 0, j = 1;
window.onresize = function(){
     if(j % 2 == 0){
         console.log(i++);
     }
     j++;
}

创建一个变量j,让j每次只有偶数的时候才执行,也就是少了一半的实行次数。
像这样处理下,可以减少50%的执行次数,但是对用户来说,并感受不到区别。

还有一种使用定时器实现的函数节流。
核心代码如下:

function throttle(method , context){
   clearTimeout(method.tId);
   method.tId = setTimeout(function(){
         method.call(context);
    },100);
}

这里传入执行函数和函数的执行环境(也就是执行函数中的this的指向对象),然后先清除动作队列,接着执行动作。
这种形式可以对动作频率做更好的控制。
假设是一个浏览器拉伸动作,那么只要你拉伸的速度够快,每次触发的时间间隔在100ms之内,那么就只会执行最后一下的结果。

 
8、自定义事件
本质是观察者模式。基本模式是需要3个函数,
一个函数是绑定事件,一个函数是触发事件,一个是移除绑定。
这种模式可以很大程度降低代码耦合性。

Javascript 相关文章推荐
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
Oct 20 Javascript
jQuery 过滤not()与filter()实例代码
May 10 Javascript
javascript实现简单的省市区三级联动
May 14 Javascript
jQuery制作input提示内容(兼容IE8以上)
Jul 05 jQuery
js canvas实现适用于移动端的百分比仪表盘dashboard
Jul 18 Javascript
jQuery ajax读取本地json文件的实例
Oct 31 jQuery
基于Vue的SPA动态修改页面title的方法(推荐)
Jan 02 Javascript
JS实现多物体运动的方法详解
Jan 23 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
May 16 Javascript
javascript的惯性运动实现代码实例
Sep 07 Javascript
详解微信小程序动画Animation执行过程
Sep 23 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
Nov 24 Javascript
鼠标拖拽移动子窗体的JS实现
Feb 25 #Javascript
js判断为空Null与字符串为空简写方法
Feb 24 #Javascript
JS清空多文本框、文本域示例代码
Feb 24 #Javascript
脚本合并提升javascript性能示例
Feb 24 #Javascript
动态加载脚本提升javascript性能
Feb 24 #Javascript
巧用局部变量提升javascript性能
Feb 24 #Javascript
javascript中的原型链深入理解
Feb 24 #Javascript
You might like
用PHP ob_start()控制浏览器cache、生成html实现代码
2010/02/16 PHP
php获取百度收录、百度热词及百度快照的方法
2015/04/02 PHP
使用PHP实现微信摇一摇周边红包
2016/01/04 PHP
php的debug相关函数用法示例
2016/07/11 PHP
php修改数组键名的方法示例
2017/04/15 PHP
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
JS下拉缓冲菜单示例代码
2013/08/30 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
2017/10/17 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
2019/04/11 Python
在django中实现页面倒数几秒后自动跳转的例子
2019/08/16 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
python实现密度聚类(模板代码+sklearn代码)
2020/04/27 Python
Django分组聚合查询实例分享
2020/04/29 Python
HTML5中的websocket实现直播功能
2018/05/21 HTML / CSS
《庐山的云雾》教学反思
2014/04/22 职场文书
初中团支书竞选稿
2015/11/21 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
Go Gin实现文件上传下载的示例代码
2021/04/02 Golang
python实现黄金分割法的示例代码
2021/04/28 Python
详解Python 3.10 中的新功能和变化
2021/04/28 Python
golang日志包logger的用法详解
2021/05/05 Golang