call()、apply()、bind()方法
1、call()方法:调用函数,改变this指向
//call()方法主要用于继承
function Father(unanme,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
function Son(){
Father.call(this,uname,age,sex);//调用Father,改变this指向
}
var son = new Son("张三",18,"男");
2、apply()方法:调用函数,改变this指向
fun.apply(thisArg,[argsArray]);//thisArg为this指向,argsArray为传递的值,需要包含在数组里边
var o = {name:'andy'};
function fn(arr){
console.log(this);
console.log(arr);
}
fn(o); //这里的this指向window,arr指向o这个对象
fn.apply(o,['pink']);//这里的this指向o,arr指向pink
apply()的主要应用:利用apply借助于数学内置对象求最大值
//Math.max();
var arr = [1,22,33,3,4];
var max = Math.max.apply(Math,arr);
console.log(max);
3、bind()方法:不会调用函数但是能够改变this指向。将函数绑定到某个对象。
fun.bind(thisArg,arg1,arg2...);//返回由指定的this值和初始化参数改造的原函数拷贝
//例子
var a = {
b:function(){
var func = function(){
console.log(this.c);
}
func();
},
c:'Hello!'
}
a.b();//undefined 因为这里的this指向全局作用域,所以会返回undefined
通过赋值的方法将this赋值给that
var a = {
b:function(){
var that = this;
var fun = function(){
console.log(that.c)
}
fun();
},
c:'Hello!'
}
a.b();//Hello
使用bind()改变this指向
var a = {
b:function(){
var fun = function(){
console.log(this.c)
}
fun.bind(this)();
},
c:'Hello!'
}
a.b();//Hello
bind()的另一种用法.
这里的bind方法会把第一个实惨绑定给f函数体内的this,所以这里的this指向{x:1}对象,从第二个参数起,会依次传递给原始函数,y=2,调用m(3)时,z=3,所以最终结果为6
function f(y,z){
return this.x + y + z;
}
var m = f.bind({x:1},2);
console.log(m(3));//6
有的函数不需要立即调用,但是又想要改变这个函数内部的this指向,此时用bind()
(这里等待补充)
var canvas = {
render:func
}
参考:https://blog.csdn.net/kongjunchao159/article/details/59113129