setTimeout中的JS前端功能的巧妙运用

setTimeout中的JS前端功能的巧妙运用
什么是功能节流
节流功能根本就不想让这个功能在很短的时间内是连续的,例如,最常见的是当窗口缩放,常常做一些其他功能,如发送一个Ajax请求等等的事情,所以当窗口缩放的这段时间,有可能是连续多请求,这不是我们想要的,或我们的普通鼠标移出标签切换,有时连续快速移动,会有闪烁的效果,那么我们可以使用函数操作油门。我们都知道,DOM的操作将被消耗或影响性能,如是说当窗口缩放,对于大量的DOM元素的结合导致连续运行,大量的C化,如伊江,过度的DOM操作会影响浏览器的性能,即使在严重导致浏览器发生的条件。在这个时候我们可以使用函数节流来优化代码。
功能节流的基本原理:
使用一个定时器,延时函数的执行,如settomeout使用()这个函数执行后延时功能,如果在当时也引发其他事件,我们可以使用除清除定时器的方法()清除定时器,然后setTimeout()执行一个新的定时器延时。

在一个团队项目,最近很忙,有这样的一个页面,使用传统的发展模式(Tucao为什么没反应过来),DOM操作,那么性能是比较差的,特别是当你放大窗口,卡顿的出现发生了一件可怕的事情,甚至瘫痪的浏览器。为什么
因为在网页上有那么多的DOM操作,将会触发功能的执行和不断的DOM操作时窗口放大每一帧,这样浏览器的成本是非常大的。现在窗口,浏览器将重新计算DOM。为什么我们不能让DOM的计算延时,窗口不能被调整到大小,节省成本,实现了浏览器的优化效果
知识准备
1。setTimeout(代码,毫秒),当然,是本文的主要特点。
The setTimeout () method is used to call a function or calculate an expression after a specified number of milliseconds.
代码是必需的。要调用的函数之后要执行的Javascript代码字符串。
毫秒是必要的,需要在代码执行之前的毫秒数。
提示:setTimeout()只执行一次代码。如果你想调用多次,使用setInterval()或调用setTimeout()让代码本身又。
广泛应用于定时器、旋转木马、动画、自动滚动等。
2。清除定时器(id_of_settimeout)
ID值,从参数id_of_settimeout setTimeout()返回的值标识延迟执行的代码块被取消
三.fun.apply(thisarg argsarray {,})
应用()方法在指定这个值和参数的情况下调用函数(参数以数组或数组对象的形式存在)。
函数的语法几乎与调用()方法的语法相同。唯一的区别是,调用()方法接受一个参数列表,而应用()接受一个多参数数组(或类数组对象)。
参数
thisarg
此值指定当乐趣的功能运行。请注意,指定这是不一定的功能时,真正的价值的价值,如果这个函数不是严格的模式,被指定为空或未定义将被自动定向到全局对象(浏览器窗口对象,在同一时间)的原始值(数字、字符串、布尔)。这是指自动包装对象的原始价值。
argsarray
一个数组或对象的数组,其数组元素作为一个参数传递给函数的乐趣。如果该参数的值为空或不确定的,这意味着不需要将参数传递。类数组对象可以用在ECMAscript 5开始。
当你调用一个已有函数时,你可以为它指定一个对象,这指的是当前对象,也就是调用函数的对象,应用后,只可以写一次,然后在另一个对象中继承它,而不重复新对象中的方法。
4。fun.call(thisarg { { {,arg1,arg2,} } }…)
此方法使用指定的这个值和一些指定的参数值来减少函数或方法的使用。
参数
thisarg
此值指定当乐趣的功能运行。请注意,指定这是不一定的功能时,真正的价值的价值,如果这个函数不是严格的模式,被指定为未定义的值将被自动定向到全局对象(浏览器窗口对象,和初始值)的原始值(数字,字符串,布尔值,该值)将指向的全自动包装的原始值的对象。
arg1,arg2,…
指定的参数列表。
当一个函数被调用时,不同的对象可以分配。这是指当前对象,调用的方法的第一个参数,通过调用的方法,你可以在一个对象用另一个对象,如object.prototype.tostring.call({ }),借的方法的对象是一个数组对象。
uff1a效应
使用调用方法调用父构造函数
使用调用方法调用匿名函数
通过调用的方法来调用匿名函数并指定the'this'of语境
在这里,一个题外话:
Apply is very similar to call (), and the difference lies in the way the parameters are provided.Apply uses an array of parameters rather than a set of parameter lists.Apply can use the array literal (array literal), such as fun.apply (this, {'eat','bananas'}), or array objects, such as fun.apply (this, new Array (this)).You can also use the arguments object as a argsArray parameter.Arguments is a local variable of a function.It can be used as all unspecified parameters of the invoked object.In this way, you do not need to know all the parameters of the invoked object when you use the apply function.You can use arguments to pass all the parameters to the invoked object.The invoked object is then responsible for dealing with these parameterS.
从ECMAscript第五版,你可以使用任何一种这类数组对象,只要有长度属性和{ 0范围内的整数属性…长。例如,你可以使用列表或对象定义为自己喜欢的{ 'length:2、0:吃吧',‘:'bananas}。
调用与应用之间的区别是,从第二个参数中,调用方法参数将依次传递给被借用的方法,应用程序将直接将这些参数放入数组中,然后传递它们。最后,借用方法的参数列表是相同的。
应用场景:参数清晰时调用是可用的,参数不明确时可以应用参数。
现在举个例子。
它总是知道onscolll,onresize等等都是有损的,和数字印刷当窗口缩放。

var计数=;
window.onresize =函数(){
计数+;
console.log(计数);
}
浏览器中浏览器窗口的大小如下所示
这显然不是我们想要的。如果我们将它更改为Ajax请求,它将一次放大并触发多个Ajax请求。现在我们尝试使用函数节流操作。当然,加入setTimeout()定时器。

第一种封装方法

var计数=;
功能ocount(){
计数+;
console.log(计数);
}
window.onresize =函数(){
DelayFun(ocount)
};
功能delayfun(方法,thisarg){
ClearTimeout(方法。道具);
method.props = setTimeout(){()函数(
method.call(thisarg)
})。
}
第二包装方法
一个壁橱被构造,一个私人的范围被用来形成一个私有的范围来存储定时器定时器,定时器是以一个参数的形式被引入的。

var计数=;
功能ocount(){
计数+;
console.log(计数);
}
VaR的乐趣= delayfun(ocount,);
window.onresize =函数(){
(快乐)
};
功能delayfun(函数,等等){
var定时器= null;
返回函数(){
var上下文=,
参数args =;
ClearTimeout(定时器);
定时器= setTimeout(){()函数(
Func.apply(上下文,args);
},等待
};
}
第二种方法的性能会更好。
这里返回一个函数,如果它被称为不中断,它将不会被执行。函数在调用停止为n毫秒之后再次执行,并且再次调用。如果立即参数被传递,函数立即被安排在执行队列中,并且不会被延迟。

功能delayfun(函数,等等,立即){
VaR超时;
返回函数(){
VaR上下文=,=参数args;
var后面的函数(){()
超时=空;
如果(!func.apply(立即)背景下,args);
};
var callNow =直接!超时;
ClearTimeout(超时);
超时= setTimeout(后来,等);
如果(callNow)func.apply(上下文,args);
};
};
使用
无功myefficientfn = delayfun(function()){
所有重操作
});
Window.addEventListener('resize ',myefficientfn);
该函数不允许回调函数在指定的时间内执行超过一次。当为频繁触发的事件分配回调函数时,这个函数尤其重要。
setTimeout是如此巨大,所以我们可以在项目中使用很多吗
就我个人而言,我不推荐它。在我们的业务,我们基本上禁止在业务逻辑的setTimeout的使用,因为很多我看的方法是通过一些问题的解决,将作为一种黑客。
例如,在实例初始化之前,我们使用这个示例。错误解决方法是添加setTimeout的实例以确保实例首先被初始化。
为什么是错的这实际上是一种使用黑客的手段。
首先是埋坑,破坏模块的生命周期。
其次,当问题出现的时候,将真的很难调试。
我认为使用它的正确方法是查看生命周期(参见软件生命周期),并将实例化引用到预使用执行中。
JS setTimeout在前端功能节流的巧妙运用,一个很小的编辑介绍给你,希望对你有帮助!
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部