这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值
(1) apply()
接收两个参数:
a. 第一个是在其中运行函数的作用域
b. 参数数组:可以是Array实例,也可以是arguments对象
比如:
function sum(num1, num2){
return num1 + num2;
}
function callSum1(num1, num2){
return sum.apply(this, arguments);
}
function callSum2(num1, num2){
return sum.apply(this, [num1, num2])
}
callSum1(10,10) // 20
callSum2(10,10) // 20
(2) call()
call()和apply()作用相同,区别仅仅在于接收参数的方式不同,call()第二个参数必须逐个列举出来
function sum(num1, num2){
return num1 + num2;
}
function callSum(num1, num2){
return sum.call(this, num1, num2);
}
alert(callSum(10,10))
其实,这两个方法真正强大之处,是可以扩充函数赖以运行的作用域
window.color = 'red';
var o = {
color: 'blue'
}
function sayColor(){
alert(this.color)
}
sayColor(); // red
sayColor.call(this) // red
sayColor.call(window) // red
sayColor.call(o); // blue,将 sayColor() 函数放在对象o中,然后再通过o来调用它
ES5还创建了一个方法:bind(),这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值
window.color = 'red';
var o = {
color: 'blur'
}
function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o)
objectSayColor()