关于bind、call以及apply

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);
原文地址:https://www.cnblogs.com/hughman/p/6816701.html