call、apply、bind应用的介绍

call、apply、bind应用的介绍


call

call() 方法调用一个函数, 其具备一个指定的 this 值和分别地提供的参数(参数的列表)。javascript

注意:该方法的做用和 `apply()` 方法相似,只有一个区别,就是 `call()` 方法接受的是若干个参数的列表,而 `apply()` 方法接受的是一个包含多个参数的数组。 java

语法:数组

fun.call(thisArg[, arg1[, arg2[, ...]]])
复制代码

参数:app

  • thisArgdom

    • 在 fun 函数运行时指定的 this 值
    • 若是指定了 null 或者 undefined 则内部 this 指向 window
  • arg1, arg2, ...函数

    • 指定的参数列表

apply

apply() 方法调用一个函数, 其具备一个指定的 this 值,以及做为一个数组(或相似数组的对象)提供的参数。ui

注意:该方法的做用和 `call()` 方法相似,只有一个区别,就是 `call()` 方法接受的是若干个参数的列表,而 `apply()` 方法接受的是一个包含多个参数的数组。 this

语法:spa

fun.apply(thisArg, [argsArray])
复制代码

参数:prototype

  • thisArg
  • argsArray

apply()call() 很是类似,不一样之处在于提供参数的方式。 apply() 使用参数数组而不是一组参数列表。例如:

fun.apply(this, ['eat', 'bananas'])
复制代码

==call 与apply的区别:== apply、call 的区别

对于 apply、call 两者而言,做用彻底同样,只是接受参数的方式不太同样。例如,有一个函数定义以下:

var func = function(arg1, arg2) {
     
};
复制代码

就能够经过以下方式来调用:

func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2])
复制代码

其中 this 是你想指定的上下文,他能够是任何一个 JavaScript 对象(JavaScript 中一切皆对象),call 须要把参数按顺序传递进去,而 apply 则是把参数放在数组里。  

bind

bind() 函数会建立一个新函数(称为绑定函数),新函数与被调函数(绑定函数的目标函数)具备相同的函数体(在 ECMAScript 5 规范中内置的call属性)。 当目标函数被调用时 this 值绑定到 bind() 的第一个参数,该参数不能被重写。绑定函数被调用时,bind() 也接受预设的参数提供给原函数。 一个绑定函数也能使用new操做符建立对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。

语法:

fun.bind(thisArg[, arg1[, arg2[, ...]]])
复制代码

参数:

  • thisArg

    • 当绑定函数被调用时,该参数会做为原函数运行时的 this 指向。当使用new 操做符调用绑定函数时,该参数无效。
  • arg1, arg2, ...

    • 当绑定函数被调用时,这些参数将置于实参以前传递给被绑定的方法。

返回值:

返回由指定的this值和初始化参数改造的原函数拷贝。

示例:

function LateBloomer() {
  this.petalCount = Math.ceil(Math.random() * 12) + 1;
}

// Declare bloom after a delay of 1 second
LateBloomer.prototype.bloom = function() {
  window.setTimeout(this.declare.bind(this), 1000);
};

LateBloomer.prototype.declare = function() {
  console.log('I am a beautiful flower with ' +
    this.petalCount + ' petals!');
};

var flower = new LateBloomer();
flower.bloom();  // 一秒钟后, 调用'declare'方法
复制代码

小结

  • call 和 apply 特性同样

    • 都是用来调用函数,并且是当即调用
    • 可是能够在调用函数的同时,经过第一个参数指定函数内部 this 的指向
    • call 调用的时候,参数必须以参数列表的形式进行传递,也就是以逗号分隔的方式依次传递便可
    • apply 调用的时候,参数必须是一个数组,而后在执行的时候,会将数组内部的元素一个一个拿出来,与形参一一对应进行传递
    • 若是第一个参数指定了 null 或者 undefined 则内部 this 指向 window
  • bind

    • 能够用来指定内部 this 的指向,而后生成一个改变了 this 指向的新的函数
    • 它和 call、apply 最大的区别是:bind 不会调用
    • bind 支持传递参数,它的传参方式比较特殊,一共有两个位置能够传递
        1. 在 bind 的同时,以参数列表的形式进行传递
        1. 在调用的时候,以参数列表的形式进行传递
      • 那到底以谁 bind 的时候传递的参数为准呢仍是以调用的时候传递的参数为准
      • 二者合并:bind 的时候传递的参数和调用的时候传递的参数会合并到一块儿,传递到函数内部
相关文章
相关标签/搜索