JS call()、apply()、bind()
1 /** 2 * JS call()、apply()、bind() 3 * */ 4 //EX1 5 var name = "小王",age = 17; 6 var obj = { 7 name:"小张", 8 objAge:this.age, 9 myFun:function() 10 { 11 console.log(this.name + "年龄" + this.age); 12 } 13 }; 14 obj.objAge;//17 15 //this指向:window 16 obj.myFun();//小张年龄undefined 17 //this指向:obj 18 19 20 //EX2 21 var fav = "LBJ"; 22 function shows() 23 { 24 console.log(this.fav); 25 } 26 shows();//LBJ 27 //this指向:window 28 29 30 31 /** 32 * call()、apply()、bind() 都是用来重新定义this的指向 33 * */ 34 var name = "小王",age = 17; 35 var obj = { 36 name:"小张", 37 objAge:this.age, 38 myFun:function() 39 { 40 console.log(this.name + "年龄" + this.age); 41 } 42 }; 43 var db = { 44 name:"LBJ", 45 age:36 46 }; 47 obj.myFun.call(db);//LBJ年龄36 48 obj.myFun.apply(db);//LBJ年龄36 49 obj.myFun.bind(db);//ƒ (){console.log(this.name + "年龄" + this.age);} 50 //bind返回的是一个函数,必须调用才会执行 51 obj.myFun.bind(db)();//LBJ年龄36 52 53 54 55 /** 56 * call()、apply()、bind() 传参情况 57 * */ 58 var name = "小王",age = 17; 59 var obj = { 60 name:"小张", 61 objAge:this.age, 62 myFun:function(fm,t) 63 { 64 console.log(this.name + " 年龄 " + this.age , " 来自 " + fm + " 去往 " + t); 65 } 66 }; 67 var db = { 68 name:"LBJ", 69 age:36 70 }; 71 obj.myFun.call(db,"北京","上海");//LBJ 年龄 36 来自 北京 去往 上海 72 obj.myFun.apply(db,["北京","上海"]);//LBJ 年龄 36 来自 北京 去往 上海 73 obj.myFun.bind(db,"北京","上海")();//LBJ 年龄 36 来自 北京 去往 上海 74 obj.myFun.bind(db,["北京","上海"])();/** LBJ 年龄 36 来自 北京,上海 去往 undefined */ 75 76 /** 77 * call、apply、bind 这三个参数的第一个参数都是this的指向对象 78 * 第二个参数:call 的参数是字符串,用逗号","分隔。 79 * apply 的参数都必须放在一个数组里传进去 80 * bind 除了返回的是函数之外,传参和call一样 81 * 当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等! 82 * 83 * 如果call和apply的第一个参数写的是null,那么this指向的是window对象 84 * */ 85 86 //原文: https://www.cnblogs.com/Shd-Study/p/6560808.html