函数执行
call();
apply();
call()
function fn(a,b,c){
console.log(this,a+b+c);
}
正常执行是:fn();//this window
call执行时:fn.call(obj);//将obj带入到函数替代函数中this的指向,原有的this会被指向obj
call带参数执行时:fn.call(obj,1,2,3);//第一个参数是函数中this指向的对象,后面会按顺序带入参数
如果call和apply带入不是对象,会自动转换为对象
fn.call(“5”); this会变为string 5
apply()
fn.apply(obj);//和call一样
fn.apply(obj,[1,2,3]);//apply只有两个参数,第一个参数是this指向的对象,第二个参数是函数所需的所有参数的数组,列表
求最小值 重构Math.min
var arr=[1,2,3,4,5];
var min=Math.min.apply(null,arr);
var Maths={
min:function(){
if(arguments.length===0) return;
var min=arguments[0];
if(arguments.length===1) return min;
for(var i=1;i<arguments.length;i++){
min=min>arguments[i] ? arguments[i] : min;
}
return min;
}
}
Maths.min.apply(null,arr)
重构slice 复制
class Arrays{
constructor(){
}
slice(start,end){
if(start===undefined) start=0;
if(end===undefined) end=this.length;
var arr=[];
for(var i=start;i<end;i++){
arr.push(this[i]);
}
return arr;
}
}
var arr=new Arrays();
arr.slice.call(document.getElementsByTagName("div")); //复制div列表
bind()
回调函数 回调函数如果需要替换this,不能使用call和apply.
比如setTimeout,如果使用了call或者apply,就会立即执行。达不到效果
这时要用bind(),执行回调或者事件函数。
通过bind可以对于回调函数传参,this就是bind绑定的内容
setTimeout:
var obj={a:1};
setTimeout((function(){
console.log(this);
}).bind(obj),10000);
事件函数:
var obj={
a:1,
b:function(){
this.handler=this.clickHandler.bind(this);
document.addEventListener("click",this.handler)
},
clickHandler:function(e){
console.log(this);
document.removeEventListener("click",this.handler)
}
}
obj.b();
红绿灯
var id;
function setLight() {
arguments[0](arguments[1], arguments[2]);
}
function showLight(fn,fn2){
clearTimeout(id);
console.log(this.toString());
id = setTimeout(fn, 2000, fn2, arguments.callee.bind(this));
}
setLight(showLight.bind("红"),showLight.bind("黄"),showLight.bind("绿"));