call,apply和bind都是Function原型中的方法。
作用就是就是改变this的指向。或者说 强行用其他对象来调用一个函数。除此之外还能在构造方法有中属性和函数的继承体现。
改变this指向的含义
function show(sex){ console.log("姓名为"+this.yourname+",性别为"+sex); } var person={ yourname:"张三", age:14 }; show.call(person,"男");//姓名为张三,性别为男 show("男");//姓名为undefined,性别为男在上面的代码块中,我们可以看到person对象并没有show方法,直接地用person.show()会报错。但是我们可以通过call方法来实现person对象来调用show方法。所以这种情况我认为就是改变了this的指向。
call和apply的使用方法相同。
call和apply的参数不同; test.call ( this, param1 , param2 , param3 ) ; // 可以传多个参数 test.apply ( this, paramArray ) ; // 只能传两个参数,第二个一般为数组
call和apply会改变this指向,然后执行函数;
非严格模式下,如果参数不传,或者第一个参数是null/undefind,this都指向window。
严格模式下,第一个参数是谁,this就指向谁(包括null/undefind),不传this是undefind。
apply,传入的数组会以数组元素一个一个传入,而不是以整个数组传入。
bind会绑定this指向,然后作为一个新函数返回;
var person= { yourname:"张三", age:14, greet: "Hello!", greetUser: function(userName) { console.log(this.greet + " " + userName); } }; var greetHola = person.greetUser.bind({greet: "Hola"}); var greetBonjour = person.greetUser.bind({greet: "Bonjour"},'Rahul'); greetHola("Rahul") // 输出"Hola Rahul" greetBonjour() // 输出"Bonjour Rahul"