call,apply,bind
- call,apply,bind这三个主要作用都是改变this指向的,但是使用的时候会有区别。
var msg = 'hello'
var obj = {
msg : 'vue.js'
}
function fn () {
// 当前this指向的是全局window
return this.msg
}
var res = fn()
console.log(res) //输出结果为hello
1、通过call来改变this的指向
var msg = 'hello'
var obj = {
msg : 'vue.js'
}
function fn (参数1) {
// 当前this指向的则是obj对象
return this.msg
}
var res = fn.call(obj) // 当前this指向obj
// fn.call(上下文环境,'参数1')
// call谁,this就指向谁,后面可以跟随参数进行传参
console.log(res) // 当前输出为vue.js
2、通过apply来改变this的指向
var msg = 'hello'
var obj = {
msg : 'vue.js'
}
function fn (val,val2) {
// 当前this指向的是obj
return this.msg
}
var res = fn.apply(obj,['传参','传参2']) // 当前this指向obj
// fn.apply(上下文环境,['传参','传参2'])
// apply谁,this就指向谁,后面以数组的形式进行传参
console.log(res) // 当前输出为vue.js
- call和apply的主要区别是在传递参数上不同,call后面传递的参数是以逗号形式分开的,apply传递的参数是数组形式,
3、通过bind来改变this的指向
var msg = 'hello'
var obj = {
msg : 'vue.js'
}
function fn () {
return this.msg
}
var res = fn.bind(obj,'传参111','传参222')
console.log(res) //当前输入为一个函数 ƒ fn () {
return this.msg
}
// 必须在后面加括号调用才可以
// bind格式:函数名.bind(上下文环境,参数)
var res = fn.bind(obj,'传参111','传参222')()
console.log(res) // 当前输出为vue.js
- bind返回的是一个函数形式,如果要执行,则后面要再加一个小括号。例如:bing(obj,参数1,参数2)(),bind只能以逗号分隔形式,不能是数组形式
@ cc