JavaScript基础知识——apply、call、bind
2017-12-05 22:08
399 查看
JavaScript中的所有函数都有三个神奇的方法,它们是apply()、call()、bind()。下面来讲讲它们有什么用。
apply()方法:接收的第一个参数是对象,即作用域;第二个参数可以是一个参数数组,也可以是一个arguments对象;
call()方法:接收的第一个参数是对象,即作用域,这是和apply()方法一样的;但是后面的参数就不一样了,call()方法接收逐个列举出来的参数,而不是参数数组或者arguments对象。
call()方法和apply()方法的用武之地在于扩充函数赖以运行的作用域。使用call()或apply()来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。如下面的例子中,obj对象不需要定义sayColor()方法,也可以调用sayColor()方法。
PS. 因为 apply() 方法可以接收一个数组作为参数,所以 apply() 方法可以有这样的妙用:ECMAScript拥有一个Math对象,Math对象提供了很多数学计算的方法,其中有两个比较大小的方法,max() 和 min();直接使用 max() 或者 min() 方法,需要将要比较的数字一个一个全部传入函数,而使用 apply() 只需传入一个数组即可,如下:
bind() 方法的作用是将这个返回的函数与传入的对象绑定,不论在任何运行环境中调用这个返回的函数(sayColor2),其this对象永远指向绑定的那个对象(这里是obj)。如下面的例子,即使在全局环境中调用函数 sayColor2(),函数返回的依然是 obj 对象的属性 color:
一、apply() 和 call()
call() 方法和 apply() 方法的作用相同,都是在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值。他们的区别在于接收的参数不同。apply()方法:接收的第一个参数是对象,即作用域;第二个参数可以是一个参数数组,也可以是一个arguments对象;
call()方法:接收的第一个参数是对象,即作用域,这是和apply()方法一样的;但是后面的参数就不一样了,call()方法接收逐个列举出来的参数,而不是参数数组或者arguments对象。
call()方法和apply()方法的用武之地在于扩充函数赖以运行的作用域。使用call()或apply()来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。如下面的例子中,obj对象不需要定义sayColor()方法,也可以调用sayColor()方法。
var color = "red"; var obj = { color:"blue" } function sayColor(){ console.log(this.color); } sayColor();//red sayColor.call(obj);//blue
PS. 因为 apply() 方法可以接收一个数组作为参数,所以 apply() 方法可以有这样的妙用:ECMAScript拥有一个Math对象,Math对象提供了很多数学计算的方法,其中有两个比较大小的方法,max() 和 min();直接使用 max() 或者 min() 方法,需要将要比较的数字一个一个全部传入函数,而使用 apply() 只需传入一个数组即可,如下:
var numbers = [1,2,3,4,5,6,7,8,9,10]; var max = Math.max.apply(Math,numbers); console.log(max);//10
二、bind() 方法
与 apply() 和 call() 不同,bind() 方法只接收一个参数,即一个对象,并且 bind() 方法的返回值是一个函数,如下:function sayColor(){ return this.color; } var obj = {}; var sayColor2 = sayColor.bind(obj); console.log(sayColor2 instanceof Function);//true
bind() 方法的作用是将这个返回的函数与传入的对象绑定,不论在任何运行环境中调用这个返回的函数(sayColor2),其this对象永远指向绑定的那个对象(这里是obj)。如下面的例子,即使在全局环境中调用函数 sayColor2(),函数返回的依然是 obj 对象的属性 color:
function sayColor(){ return this.color; } var color = "red"; var obj = { color:"blue" }; var sayColor2 = sayColor.bind(obj); console.log(sayColor2());//blue
相关文章推荐
- JavaScript基础 (十二) ---- call apply bind的区别
- 【js基础】javascript中的apply() call() bind() 方法是javascript专业人员的基础[译]
- 关于javascript中apply()、call()和bind()方法
- Javascript中的apply、call、bind
- JavaScript中apply()、call()和bind()的相似与区别
- Javascript中call,apply,bind方法的详解与总结
- 深入理解JavaScript中的call、apply、bind方法的区别
- javascript中call()、apply()及bind()
- 深入浅出妙用 Javascript 中 apply、call、bind
- 浅谈JavaScript中的apply/call/bind和this的使用
- javascript中this、apply、call、bind的用法和区别
- Javascript中的Bind,Call和Apply
- javascript中apply、call和bind的区别
- JavaScript中的call,apply,bind的使用
- JavaScript方法call,apply,caller,callee,bind的使用详解及区别
- JavaScript中call,apply,bind方法的总结
- Javascript中的apply、call、bind
- Javascript中call,apply,bind方法的详解与总结
- JavaScript:call,apply,bind的用法
- javascript中的作用域 (apply、call、.bind)