apply、call、bind区别、用法

apply和call都是为了改变某个函数运行时的上下文而存在的(就是为了 改变函数内部this的指向);
 
若是使用apply或call方法,那么this指向他们的第一个参数,apply的第二个参数是一个参数数组,call的第二个及其之后的参数都是数组里面的元素,就是说要所有列举出来;
 
他们的 经常使用用法
1.数组之间的追加;
2.获取数组中的最大值和最小值,利用他们扩充做用域拥有Math的min和max方法;
因为没有什么对象调用这个方法,因此第一个参数能够写做null或者自己;
var  numbers = [5, 458 , 120 , -215 ]; 
var  maxInNumbers = Math.max.apply(Math, numbers),   //458
       maxInNumbers = Math.max.call(Math,5, 458 , 120 , -215); //458
3.验证是不是数组(前提是toString()方法没有被重写过)
function   isArray(obj){ 
    return Object.prototype.toString.call(obj) === '[object Array]' ;
}
4.让类数组拥有数组的方法
 
好比arguments对象,获取到的文档节点等,并无数组的那些方法:
Array.prototype.slice.apply(argument); //理论上来讲这个比较快,直接在原型上查找slice方法
                                                                 //但实际上比较慢
或者
[].slice.apply(arguments); //理论上来讲这个比较慢,由于要Array作一个实例化再查找slice方法
                                        //实际上比较快,由于如今的各类自动化工具会把上一种方法转换为这种,而第二种代码比较简洁,因此会比较快;
 
 
bind()--也是改变函数体内this的指向;
bind会建立一个新函数,称为绑定函数,当调用这个函数的时候,绑定函数会以建立它时传入bind()方法的第一个参数做为this,传入bind()方法的第二个及之后的参数加上绑定函数运行时自己的参数按照顺序做为原函数的参数来调用原函数;
 
bind与apply、call最大的区别就是:bind不会当即调用,其余两个会当即调用
例子:
 
若是屡次调用bind,那么多出来的次数都是无效的,
 
 
三个的使用区别:
都是用来改变函数的this对象的指向的;
第一个参数都是this要指向的对象;
均可以利用后续参数传参;
bind是返回对应函数,便于稍后调用,apply、call是当即调用;
相关文章
相关标签/搜索