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 相关文章推荐
Javascript 模式实例 观察者模式
Oct 24 Javascript
jQuery中(function(){})()执行顺序的理解
Mar 05 Javascript
JS实现简单的图书馆享元模式实例
Jun 30 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
Aug 22 Javascript
js实现新年倒计时效果
Dec 10 Javascript
微信公众平台开发教程(五)详解自定义菜单
Dec 02 Javascript
jquery+html仿翻页相册功能
Dec 20 Javascript
JS实现的表头列头固定页面功能示例
Jan 10 Javascript
Vue实现PopupWindow组件详解
Apr 28 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
Jul 08 Javascript
JavaScript使用表单元素验证表单的示例代码
Aug 20 Javascript
使用kbone解决Vue项目同时支持小程序问题
Nov 08 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 获取百度的热词数据的代码
2012/02/18 PHP
基于flush()不能按顺序输出时的解决办法
2013/06/29 PHP
php使用mysqli向数据库添加数据的方法
2015/03/20 PHP
PHP封装CURL扩展类实例
2015/07/28 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
PHP时间相关常用函数用法示例
2020/06/03 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
理解JavaScript的caller,callee,call,apply
2009/04/28 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
js使用DOM操作实现简单留言板的方法
2015/04/10 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
Web纯前端“旭日图”实现元素周期表
2017/03/10 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
对于Python的Django框架部署的一些建议
2015/04/09 Python
python获取各操作系统硬件信息的方法
2015/06/03 Python
使用python turtle画高达
2020/01/19 Python
python如何保存文本文件
2020/06/07 Python
python如何编写win程序
2020/06/08 Python
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
瀑布模型都有哪些优缺点
2014/06/23 面试题
年级组长自我鉴定
2014/02/22 职场文书
高中生职业生涯规划书
2014/02/24 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
餐厅保洁员岗位职责
2015/04/10 职场文书
2016年清明节红领巾广播稿
2015/12/17 职场文书
Django使用echarts进行可视化展示的实践
2021/06/10 Python
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL
MySQL修炼之联结与集合浅析
2021/10/05 MySQL