更改this的几种方式

"Hello World, Hello Blog"

Posted by wudimingwo on December 15, 2018
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function print () {
      	var marty = {
      	  name : 'marty',
      	  printName:function(){console.log(this.name);}
      	}
      	var test1 = {name:'test1'};
      	var test2 = {name:'test2'};
      	var test3 = {name: 'test3'};
      	test3.printName = marty.printName;
      	var printName2 = marty.printName.bind({name:123});
      	marty.printName.call(test1); //test1
      	marty.printName.apply(test2);//test2
      	marty.printName();//marty
      	printName2();//123
      	test2.printName2 = printName2;
      	test2.printName2();//123
      	test3.printName();//test3;
        
      }
      print();

这道题包含了常用的.
1.fun()  this默认指向window
2.obj.fun() this指向obj
3.obj.fun.call(obj1) this指向obj1
4.obj.fun.apply(obj1) this指向obj1
5.var fun1 = fun.bind(obj)  返回一个函数 , 绑定this, 固定指向obj.  2,3,4方法都失效
      如果执行时硬要改,有个笨方法  fun1.bind(obj1)(); 用bind再绑定一次
      new 的时候,this会指向实例,绑定失效.

6.还有一个new fun(); this 指向一个生成的实例对象.

上面有地方写错了. 通过bind绑定的this , 再次使用bind 也无法改变. js小白模拟系列:模拟bind 通过模拟可以看出, bind通过嵌套一层函数来固定原来函数的this指向, 嵌套的函数的this指向怎么改变都无法影响 this指向, 除了new