上一次,Ajax部分完成了。本周,我们完成了高级技能部分。
1、
类型检测 Object.prototype.toString.call的方式(obj)使用。
因为无论是类也可以准确地确定变量的类型。
2。一个安全的构造
函数 通常,在定义构造函数时,我们使用类似的
方法。
复制代码代码如下所示:
功能人(名称){
this.name =名称;
}
然而,如果不去功人=新的人(cnblogs )。
它是无功的人=人(cnblogs ),那么这将点在别处,对其余的对象造成污染。
解决的办法是判断的时候this.property
设置 这是人
如果不是,那么新的人(X,X,X);
复制代码代码如下所示:
功能人(名称){
如果(这是个人){
this.name =名称;
其他{ }
返回新人(姓名);
}
}
但要注意,如果构造函数的其余试图继承通过person.call(,X)。
需要注意的是,该函数的原型在实例化之前是指向人的。
3,惰性负载功能
在调用函数时,常常会判断
浏览器的功能。
例如
复制代码代码如下所示:
功能创造(){
如果(supporth5){
做某事
其他{ }
/ /做别的事
}
}
然而,如果一个浏览器
支持一个函数,它必须始终被支持,所以在
执行代码时不必判断每一次,因为判断一次就足够了。
所以可以重写
复制代码代码如下所示:
功能创造(){
如果(supporth5){
(创造=功能){ / /改写创造功能
做某事
}
其他{ }
/ /同上。
}
}
这样,第一个调用将被判断,然后函数被重写,它自然不会被判断。
4。功能的结合
在JS中,最困惑的是谁指向了这个问题。
事实上,在我
学习JS的很长一段时间里,我找到了一个结论。
函数中的这个点指向最终调用函数的对象,换句话说,哪个对象调用函数,这指向那个对象。
要清楚地表明,函数绑定不是问题。
调用变更函数的方法是调用和应用,但是所有这两种方法都将执行函数。
如果您不想执行一个函数,而不是将函数传递给函数并希望更改该函数,请使用最新绑定。
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 =函数(){
console.log(我+ +);
}
试图
扩展浏览器,你会
发现控制台马上
显示我已经超过100了。
改变写作的方式,例如:
复制代码代码如下所示:
var i = 0,j = 1;
window.onresize =函数(){
如果(j % = 2 = 0){
console.log(我+ +);
}
++;
}
创建一个变量j,允许j每次只执行偶数,即减少一半的次数。
这样的处理可以减少50%的执行数,但是对于
用户来说,它并没有感觉到差异。
还有一个使用定时器的函数节流。
核心代码如下所示:
复制代码代码如下所示:
函数节流(方法,上下文){
ClearTimeout(方法。TID);
method.tid = setTimeout(){()函数(
method.call(
背景);
},100);
}
这里我们
介绍了执行函数和函数的执行环境,也就是说,在函数中执行这个指向对象,然后先清除动作队列,然后执行操作。
这种形式可以更好地控制行动的
频率。
假设它是一个浏览器的伸展动作,只要你拉得足够快,每个时间间隔触发在100ms,那么只有最后的结果将被执行。
8。自定义事件
本质是观察者
模式,基本模式是3个功能的需要,
函数是绑定事件,函数是触发事件,而另一个函数是
删除绑定。
这种模式可以大大减少代码耦合。