function debounce(func,wait,immediate){
var timeout;
return function(){
var context=this,args=arguments;
var later=function(){
timeout=null;
//看见很多这样的写法都经常要apply一下,
//像这种不直接 func()就可以了吗?虽然说好处是指定上下文,但这个上下文写不写都是指向window
//为什么还要去定义?
if(!immediate) func.apply(context,args);
};
var callNow=immediate && !timeout;
clearTimeout(timeout);
timeout=setTimeout(later,wait);
if(callNow) func.apply(context,args);
};
};
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
apply的目的在于重新指定函数执行的this对象
在这里func函数被包装了一下,返回了一个新的函数,而这个函数被作为一个普通函数调用还是会被作为一个方法调用是无法预知的,那么从兼容性及安全的角度来将,将新函数的this对象apply给func是个安全的做法,防止出现一些意向不到的情况
如下代码所示:
直接调用
使用apply
如果这个方法被某个dom的事件所调用,或者被new出那this就非Windows了,还有在严谨模式下。这样直接调用该方法会报错
apply是指定上下文执行,但是this并不是都指向window
至于apply的作用,无非是'借鸡生蛋',上面的例子,假如有cat = {species:'cat'},但是没有say方法,可以通过apply改变上下文来借用dog里面的say方法,稍微改下上面的例子。
另外call作用和apply类似,但是call是参数确定时使用,apply是参数不确定时使用,当参数不确定时,内部可以通过遍历arguments数组来获取。
这段代码的确context是指向window,你这代码是哪摘抄来的吧,在那里的this是指向某个对象的吧。既然你知道apply是干嘛用的,你需要用的时候用就行了,可能在他的需求里用得着这个,而你摘抄出来这一小段,用不着也不奇怪。