javascript-call、apply、bind区别
this.name = "gigi"; this.age = 22; var star = { name:"yoyo", age:23, _age:this.age, print(){ console.log(this.name + " " + this.age + " " + this._age); } } star.print();//yoyo 23 22
可以看到第一个this指向的都是star对象,star对象里_age指向的this是全局
call()、apply()、bind() 都是用来重定义 this 这个对象的
star.print.call(this);//gigi 22 undefined star.print.apply(this);//gigi 22 undefined star.print.bind(this)();gigi 22 undefined
可以看到this指向都指向全局了全局没有_age属性,故打印出undefined,bind 返回的是一个新的函数,你必须调用它才会被执行,故得在后面加多个()
对比call 、bind 、 apply 传参情况下
var person1 = { name:"行运茶", print:function(arg1,arg2){ console.log("My name is " + this.name + arg1 + arg2); } } var person2 = { name:"快乐水", print:function(arg1,arg2){ console.log("My name is " + this.name + arg1 + arg2); } } person1.print.call(person2,"好","帅");//My name is 快乐水好帅 person1.print.apply(person2,["好","帅"]);//My name is 快乐水好帅 person1.print.bind(person2,"好","帅")();//My name is 快乐水好帅
call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数就不一样,call和apply是一样的,直接接放进去的,第二第三第 n 个参数全都用逗号分隔
apply 的所有参数都必须放在一个数组里面传进去