call bind apply的使用及区别

167 阅读3分钟

call bind apply的使用及区别

1.call()

1.调用函数,改变函数中的this

2.第一个参数 设置函数内部this的指向其它参数,对应函数的参数

3.函数的返回值 call的返回值就是函数的返回值

4.测试

1    function fn(x, y) {
2      console.log(this);
3      console.log(x + y);
4    }
5
6    var obj = {
7      name: 'zs'
8    }
9    fn.call(obj, 5, 6);
10
11   //Object      // name:'zs'
12   //11

2.apply()

apply 只有两个参数

1.调用函数,改变函数中的this

2.第一个参数 设置函数内部this的指向

3.第二个参数 是数组

4.函数的返回值 apply的返回值就是函数的返回值

1    var obj = {
2      name: 'ls'
3    }
4    fn.apply(obj, [1, 2]);
5
6    //Object      // name:'ls'
7    //3

3.bind()

1.改变函数中的this,不会调用函数,而是把函数复制一份

2.第一个参数 设置函数内部this的指向

3.其它参数,对应函数的参数

4.函数的返回值 bind的返回值就是函数的返回值

1    var obj = {
2      name: 'ww'
3    }
4    var f = fn.bind(obj, 5, 5);
5    f();
6
7    //Object      // name:'ww'
8    //10

4. 总结区别

call、apply与bind的差别

call和apply改变了函数的this上下文后便执行该函数,而bind则是返回改变了上下文后的一个函数。

bind与apply、call最大的区别就是:bind不会立即调用,其他两个会立即调用

call、apply的区别

call与apply之间的差别在于参数的区别,call和aplly的第一个参数都是要改变上下文的对象,

而call从第二个参数开始以参数列表的形式展现,

apply则是把除了改变上下文对象的参数放在一个数组里面作为它的第二个参数。

例子1:

1    let arr1 = [1, 2, 19, 6];
2    //例子:求数组中的最值
3    console.log(Math.max.call(null, 1,2,19,6)); // 19
4    console.log(Math.max.call(null, arr1)); // NaN
5    console.log(Math.max.apply(null, arr1)); //  19 直接可以用arr1传递进去
6

例子2:

1    function fn() {
2      console.log(this);
3    }
4    // apply方法结果同下
5    fn.call(); // 普通模式下this是window,在严格模式下this是undefined
6    fn.call(null); // 普通模式下this是window,在严格模式下this是null
7    fn.call(undefined); // 普通模式下this是window,在严格模式下this是undefined
8

5.应用

5.1 call的应用

----将伪数组转化为数组

伪数组和数组的区别:
1.真数组的长度是可变的;伪数组的长度是不变的
2.真数组可以使用数组中的方法(push、pop等方法);伪数组不可以使用数组中的方法;

  1     var obj = {
  2        0: 100,
  3        1: 10,
  4        2: 11,
  5        3: 20,
  6        length: 4
  7     };
  8     Array.prototype.push.call(obj, 30);
  9     console.dir(obj);

输出结果:

 1    Object
 2    0: 100
 3     1: 10
 4     2: 11
 5     3: 20
 6     4: 30
 7     length: 5
 8     __proto__: Object
  

(沿用伪数组)

   1    Array.prototype.splice.call(obj, 0, 3);
   2    console.dir(obj);
   

输出结果:

  1     Object
  2       0: 20
  3       length: 1
  4       __proto__: Object
  

5.2 apply的应用

求数组的最大值

1    var arr = [5, 10, 1, 3, 6];
2    // Math.max不能求数组中的最大值
3    console.log(Math.max(arr));   //NaN
4
5    console.log(Math.max.apply(null, arr));   //10
6
7    console.log(Math.max.apply(Math, arr));   //10
8
9    console.log(arr);   // [5, 10, 1, 3, 6]
10
11   console.log.apply(console, arr);   //5 10 1 3 6 (去除中间的逗号)

数组拼接,添加

1    let arr1 = [1,2,3];
2    let arr2 = [4,5,6];
3 
4    //数组的concat方法:返回一个新的数组
5    let arr3 = arr1.concat(arr2); 
6    console.log(arr3); // [1, 2, 3, 4, 5, 6]
7
8    console.log(arr1); // [1, 2, 3] 不变
9    console.log(arr2); // [4, 5, 6] 不变
10   // 用 apply方法
11   [].push.apply(arr1,arr2);  // 给arr1添加arr2
12   console.log(arr1); // [1, 2, 3, 4, 5, 6]
13   console.log(arr2); // 不变
14

5.3 bind的应用

1    var obj = {
2      name: 'zs',
3      fun: function() {
4        setInterval(function() {
5          console.log(this.name);
6        }.bind(this), 1000);
7      }
8    }
9    obj.fun();
10
11   btn.onclick = function () {
12     // 事件处理函数中的this  是触发该事件的对象
13
14     // 通过bind 改变事件处理函数中this的指向
15   }.bind(obj);