您的位置:首页 > 移动开发

JavaScript基础知识——apply、call、bind

2017-12-05 22:08 399 查看
JavaScript中的所有函数都有三个神奇的方法,它们是apply()、call()、bind()。下面来讲讲它们有什么用。

一、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 函数