我们来看下面的一段代码
上面的代码就是say()的调用方法其实是window,所以this.name就是指的是window,如果我想对man进行问候呢,这时候就要用到call(),apply(),bind(),这三个方法实际上就是函数原型链 Function.prototype 上的方法,每个函数都拥有的,主要用来改变函数的 this 指向。下面就解析这三者的区别
call()的使用
call 语法
fun.call(this.Arg,arg1,arg2,....);
thisArg 表示 this 指向,如果为 null 和 undefined 则指向全局对象。后面的为参数列表。
apply()的使用
apply 语法
fun.apply(this.Arg,[argsArray]);这里的argsArray不仅仅可以是数组也可以是类数组的对象
let params = {
name:"zhangsan",
age:12.
}
fun.apply(this.Arg,[params]);
apply的传递参数的方式也可以使用es6语法...然后用call代替,如:fun.call(this.Arg,...[arg1,arg2,....])
bind()的使用
bind 语法
fun.apply(this.Arg[,arg1[,arg2[,....]]]);
但是作用却不一样
可以看到,不像 call 和 apply,bind 并非是立即执行的,而是会新生成一个新的方法,之后可随意调用。当然也可以提前将参数 bind 进去