apply()方法的使用:
//call apply
function sum (num1,num1){
return num1+num1
}
function callSum1(num1,num2){
console.log(arguments)
return sum.apply(this,arguments) //传参方式一:传入arguments对象
}
function callSum2(num1,num2){
return sum.apply(this,[num1,num2]) //传参方式二:传入参数数组
}
console.log(callSum1(10,10))
console.log(callSum2(10,10))
call()方法的使用:
function callSum (num1,num2){
return sum.call(this,num1,num2)
}
console.log(callSum(10,10))
从上面可以看出,apply和call在使用上主要是调用函数时传入的参数不同。作用是一样的~
apply和call方法的第一个参数都是和this
- apply传参方式
传参方式一:传入arguments对象
传参方式二:传入数组
- call传参方式
传参方式一:将参数一个一个均列出来
apply()和call()真正强大的地方并不是给函数传参,而是控制函数调用上下文即函数体内this值的能力~~如下~~
window.color = 'red'
let obj = {
color:'blue'
}
function sayColor(){
console.log(this.color)
}
sayColor() //全局调用函数,this指向window
sayColor.call(this) //this指向window
sayColor.call(window) //this指向window
sayColor.call(obj) //改变了this指向,指向对象obj
sayColor.call(obj)把函数的执行上下文即this切换为对象obj之后,结果就成了blue
使用call()或apply()的好处是将任意对象设置为任意函数的作用域,这样对象可以不用关心方法
ES5处于同样的目的推出了一个新方法:bind() bind()方法会创建一个新的函数实例,其this值会被绑定到传给bind()的对象上
window.color = 'red'
let obj = {
color:'blue'
}
function sayColor(){
console.log(this.color)
}
let objSayColor = sayColor.bind(obj)
objSayColor()
这里在sayColor()上调用bind()并传入对象obj,创建了一个新函数objSayColor (),objSayColor ()中的this值被设置为obj,因此直接调用这个函数,即使是在全局作用域中调用,也会返回字符串blue。