2-3函数的bind(),call(),apply()方法

--------------------call------------------------
call
1 调用函数,改变函数中的this
2 第一个参数 设置函数内部this的指向
  其它参数,对应函数的参数
3 函数的返回值 call的返回值就是函数的返回值
4 测试
function fn(x, y) {
  console.log(this);
  console.log(x + y);
}
fn(5, 6); // this->window
    // obj对象
var obj = {
  name: 'zs'
}
fn.call(obj, 5, 6);


// 应用
// 1、用来操作伪数组(伪数组中没有数组拥有的方法,比如push()方法)
var a;
function f1() {
    // 用a来接收
    a = arguments;//arguments是一个伪数组
}

f1(3,5,2);
// 利用Array中的方法
Array.prototype.push.call(a, 9);//为a增加一个9,里面的length属性也会自动增加

// 2、查看类型
console.log(obj.toString());// 输出:[object Object],前面的object表示是一个对象,后面的表示对象的类型是Object
var arr = [3,5];
console.log(arr);// 输出了:[3, 5],因为数组重写过这个方法
console.log(Object.prototype.toString.call(arr));//输出:[object Array]
// 我们可以通过这个查看对象的类型



    --------------------apply------------------------
   apply 只有两个参数
    1 调用函数,改变函数中的this
    2 第一个参数  设置函数内部this的指向
      第二个参数  是数组,将数组中的内容当做函数传入
    3 函数的返回值 apply的返回值就是函数的返回值
    4 测试

    // 函数fn
function fn(x, y) {
  console.log(this);
  console.log(x + y);
}   
// 对象obj
var obj = {
  name: 'ls'
}
// 将fn中的this指向obj
fn.apply(obj, [1, 2]);


// apply的应用
// 我们知道Math中有max方法可以找出最大值
console.log(Math.max(1,5,33,5,7));
// 在数组中我们没有max方法找出一组数的最大值,借助Math.max方法
var arr = [3,22,4,6,1]; 
var max = Math.max.apply(Math, arr);//我们传入的arr数组会被展开,当做实参
console.log(max);


--------------------bind----------------

 bind 
1 改变函数中的this,不会调用函数,而是把函数复制一份
2 第一个参数 设置函数内部this的指向
  其它参数,对应函数的参数
3 函数的返回值 call的返回值就是函数的返回值
4 测试

// 创建函数fn
function fn(x, y) {
  console.log(this);
  console.log(x + y);
}
fn(2,3);  // this -> window
//创建obj对象
var obj = {
  name: 'ww'
}

var f = fn.bind(obj, 5, 5); //将this -> obj
f();

你可能感兴趣的:(2-3函数的bind(),call(),apply()方法)