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