在JS中每个函数都包含两个非继承而来的方法
- call()
- apply()
这两个函数作用都是:
在特定的作用域中调用函数,等于设置函数体内this对象的值,
以扩充函数赖以运行的作用域
区别:
1.call()接收多个参数 call(this, 参数1, 参数2, …)
传递的每个参数需要挨个列举出来
2.apply()接收两个参数 apply(this, [参数1, 参数2, …])
第一个与call相同接收this
第二个参数可以为一个参数数组也可以是arguments对象
call()和apply() 的作用完全相同 区别仅在于接受的参数不同
eg:call() apply()
window.name = 'window'
var a = {
name: 'a'
}
function showEnvoriment() {
console.log(this.name)
}
showEnvoriment.call() // {1}
showEnvoriment.apply()
showEnvoriment.call(window)
showEnvoriment.apply(window)
showEnvoriment.call(a) // {2}
showEnvoriment.apply(a)
showEnvoriment.call(this) // {3}
showEnvoriment.apply(this)
{1}若call()没有指定this方向 则默认为window
{3}call() 作用域变为a this指向a
{4}与{1}一样 参数为this或为空都默认为window
apply()查找最大值的使用:
var num = [1, 2, 3, 4, 22, 51, 23, 12, 512, 534, 9, 6]
console.log(Math.max.apply(null, num))//534
使用call与apply的好处:
扩充作用域让对象不需要与方法有耦合关系
bind()方法:绑定函数
window.name = 'window'
var a = {
name: 'a'
}
function showEnvoriment() {
console.log(this.name)
}
var objshowEnvoriment = showEnvoriment.bind(a)
objshowEnvoriment()// a
showEnvoriment()调用bind()并传入对象a, 创建了objshowEnvoriment()函数
因此即使在全局作用域中调用这个函数依然会是a