call以及apply的用法
1、调用函数
function foo(n){
console.log(n);
}
foo(1);
foo.call(null,2);
foo.apply(null,[3]);
2、改变所调用的函数的内部的this值的指向
var a=1;
function foo(b){
console.log(this.a+b);
}
foo(2);
foo.call({a:3},4);
foo.apply({a:5},[6]);
3、借用其他对象的方法
var arr=[12,34,6,32,12,43];
var ret=Math.max.apply(null,arr);
console.log(ret);
4、把类数组转换成数组
var obj={0:'1',1:'2',length:2};
var ret=[].slice.call(obj);
console.log(ret);
关于slice的用法
var arr=[12,23,45,87];
var arr1=arr.slice(0,2);
console.log(arr1);
var arr2=[23,56,76];
var ret=arr.slice.call(arr2,0,2);
console.log(ret);
var rets=[].slice.call(arr2,0,2);
console.log(rets);
var retss=Array.prototype.slice.call(arr2,0,2);
console.log(retss);
关于push的用法
var arr=[];
arr.push('hello');
[].push.call(arr,'hi');
[].push.apply(arr,['ni','hao']);
console.log(arr);
bind方法的使用
bind是ES5的新特性,作用是改变函数内部的this指向
bind本身不会调用函数,仅仅会改变函数内部的this指向,并且返回一个新的函数(新函数唯一的变化就是this变了,编成了bind的第一个参数)
var a=1;
var b=2;
function foo (c) {
console.log(this.a+this.b+c);
}
foo(1);
var fn=foo.bind({
a:3,
b:4
},1);
fn();
什么时候需求使用bind
var obj={
a:1,
b:2
};
setTimeout((function(){
console.log(this.a+this.b);
}).bind(obj),1000);
var fn=(function(){
console.log(this.a+this.b);
}).bind(obj);
setTimeout(fn,1000);
setTimeout((function(){
return (function(){
console.log(this.a+this.b);
}).bind(obj);
})(),1000);