了解call,apply,bind

apply() 方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数。
fn.apply(context, [Array])

var value = 100
var obj = {value:200}
function fn(a,b) {
  console.log(this.value + a + b);
}
fn(1,2)//103
fn.apply(obj,[1,2])//203

call()方法调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)。
fn.call(context, arg1, arg2, ...)

var value = 100
var obj = {value:200}
function fn(a,b) {
  console.log(this.value + a + b);
}
fn(1,2)//103
fn.call(obj,1,2)//203
由此可见call apply,调用一个函数,传入函数执行上下文及参数,第一个参数都是希望设置的this对象,不同之处在于call方法接收参数列表,而apply接收参数数组

bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。
fn.bind(context[, arg1[, arg2[, ...]]])

var value = 100
var obj = {
  value:200
}
function fn(a,b) {
  console.log(this.value + a + b);
}
fn(1,2)//103
fn.bind(obj)(1,2)//203

bind还可以这样使用,这样我们就不需要改变第二个this了,第二个this的上下文指的就是第一个this,而第一个this指的是绑定时间的这个元素

document.addEventListener('click', function(e){
    console.log(this);
    setTimeout(function(){
        console.log(this);
    }.bind(), 200);
}, false);

下面来实现获取数组中的最大值几种方法

var arr = [78,22,3,199,0,-1,3]

console.log(Math.max.apply(null, arr));
console.log(Math.max.call(null,78,22,3,199,0,-1,3));
console.log(Math.max.bind()(78,22,3,199,0,-1,3));
console.log(Math.max(78,22,3,199,0,-1,3) );
console.log(Math.max(...arr) );

var arr = [78,22,3,199,0,-1,3]

function arrayMax(arrs) {
    var max = arrs[0];
    for(var i = 1; i < arrs.length; i++) {
        if(arrs[i] > max) {
            max = arrs[i];
        }
    }
    return max;
}
console.log(arrayMax(arr));//15

可以用apply,call,bind,...等方法直接获取数组的最大值,或者遍历数组

你可能感兴趣的:(了解call,apply,bind)