不同情况下的this指向问题
全局情况定义函数的this指向为window
var str = 'var声明'
let str1 = 'let声明'
function fun() {
console.log(this)
console.log(this.str)
console.log(this.str1)
}
fun()
改变this指向方法
call
var str = 'var声明'
let obj = {
str: '我是obj内的str'
}
function fun() {
console.log(this)
console.log(this.str)
}
fun.call(obj) //立即执行
fun()
apply
var str = 'var声明'
let obj = {
str: '我是obj内的str'
}
function fun() {
console.log(this)
console.log(this.str)
}
fun.apply(obj) //立即执行
fun()
bind
var str = 'var声明'
let obj = {
str: '我是obj内的str'
}
function fun() {
console.log(this)
console.log(this.str)
}
let f1 = fun.bind(obj)//不会立即执行,需要调用执行
console.log(f1)
f1()
fun()
总结
相同点:
- 都是用来改变this指向的,且第一个参数为指向的this
- call和apply都是用在执行函数的时候
- 如果call和apply的第一个参数是null,那么this在node环境下指向的是global对象,在HTML中指向的是window对象
call、apply、bind的不同点- call和apply立即执行,而bind需要调用才执行
- 参数不同:apply的第二个参数格式为数组,而call和bind多个参数一一对应