apply,call,bind的区别

来源:互联网 发布:sql语句给字段起别名 编辑:程序博客网 时间:2024/05/18 21:49

apply,call,bind的区别

首先,每个函数都包含两个非继承而来的方法,call和apply,而这两个方法的作用及其相似,即均为在特定的作用域中调用函数,即设置this的值

  • **传递参数
  • **扩充函数赖以运行的作用域

apply

apply方法接收两个参数,第一个参数为制定函数的执行作用域,第二个参数是一个数组,可以是Array实例,也可以是一个arguments对象。如:

function add(arg1,arg2){    return arg1+arg2;}function applyadd1(arg1,arg2){    return add.apply(this,[arg1,arg2]);}function applyadd2(arg1,arg2){    return add.apply(this,arguments);}

call

call方法与方法的作用完全一样,只是传递参数的方法不同,apply的第二个参数是数组,而apply除了第一个参数为绑定的执行作用域外,其余参数都直接传递给函数,即在使用call方法时,传递给函数的参数必须逐个列举出来,如下:

function calladd(arg1,arg2){    return add.apply(this,arg1,arg2);}

设置this的值

传递参数并不是apply和call的真正意义,它们真正强大的作用在于可以扩充函数赖以运行的作用域,即改变this的值,如下

window.age=12;var obj={o:15};function showage(){ alert(this.age);}showage()//12;showage.call(o);//15showage.apply(window);//15

使用call和apply来扩充作用域的最大好处是,不需要函数和对象之间存在耦合的关系,即不需要将函数放在对象中。

bind

bind会绑定this的值,在绑定作用域方面类似call和apply,不同的是,bind会返回一个函数的实例,只要将这个返回值赋给一个变量,以后再调用这个生成的函数,作用域总是当时绑定的作用域(可以理解为apply,call只是一次性的,而bind是生成一个新的不同作用域的函数,以后可以随时调用),如

window.age=12;var obj={o:15};function showage(){ alert(this.age);}var showageofo=showage.bind(o);showage()//12;showageofo();//15
原创粉丝点击