call 、apply、bind各自的特点:
call 特点:
1、改变this指向
2、使用时候函数已被执行
3、传参时候以逗号的形式分开,一个一个传递 //Fn2.call(上下文环境obj,‘’,‘’)
apply 特点:
1、改变this指向
2、使用时候函数已被执行
3、传参时候必须以一个类数组或数组的形式传递,不然的话会报错 //Fn2.apply(上下文环境obj, [18, 20])
bind 特点:
1、改变this指向
2、返回的是函数本分,函数并没有执行,需要通过事件触发后才会执行,
3、传参的话和call的形式是一样的,都是通过逗号的形式分割,一个一个传递 //Fn.bind(上下文环境obj, 'username', '20岁')()
如果着三个中上下问环境为null或者undefined的时候,默认就指向了window 比如:函数名.call(null)
使用call改变this指向:
var name = 'react.js'
var obj = {
name: 'Vue.js',
Fn: function () {
function Fn2() {
console.log(this.name)
}
//如果这里不修改this指向的话,this指向的是window,call谁,this就指向谁
Fn2.call(obj)
}
}
obj.Fn()
使用apply改变this指向:
var name = 'react-js'
var obj = {
name: 'Vue.js'
}
function res(v1, v2) {
console.log(v1, v2)
return {
name: this.name,
age: v1,
age2: v2
}
}
//传参时候必须以一个类数组或数组的形式传递,apply谁,this就指向谁。
var result = res.apply(obj, [18, 20])
console.log(result)
使用bind改变this指向
var name = 'react.js'
var obj = {
name: 'Vue.js'
}
function Fn(name, job, age) {
console.log(arguments)
return {
class: this.name,
user: name,
job: job,
age: age
}
}
//传参的话和call的形式是一样的,都是通过逗号的形式分割,一个一个传递,bind谁,this指向谁
var result = Fn.bind(obj, 'username', '20岁')()
console.log(result)