由于js是动态类型语言,所以this的指向并不是定义声明时就确定的,而是在程序运行时动态确定的
作为对象的方法调用:
1 2 3 4 5 6 7 8 9 10
| var test = { aFunc:function() { console.log(this.b); }, b:'in test func' }; var b = 'out test func'; test.aFunc();
输出“in test func” ,this指向的是test 对象
|
作为普通函数调用:
1 2 3 4 5 6 7
| function test (){ console.log(this.b); } var b = 'test'; test();
输出“test” 。this 指向的是window对象
|
构造器调用:
如 函数作为一个构造器使用,
1 2 3 4 5 6 7
| function Test(name){ this.name = name; } var newT = new Test('tt'); console.log(newT.name);
输出 'tt'。 this 指向的是新创建的对象,如果构造函数的返回是一个对象,那么this返回该对象,否则返回新创建的对象
|
call 或 apply,bind 调用
call, apply ,bind都可以改变运行时this的指向。
1 2 3 4 5 6 7 8 9 10 11 12
| var test1 = { aFunc:function(){ console.log(this.name); }, name:'test1' } var test2 ={ name: "test2" }; test1.aFunc.apply(test2);
输出'test2' 。this指向的是 test2 对象。
|
call和apply没什么区别,只是传入的参数不一样,call传入的第一个参数是this的指向,从第二个参数开始一个个传入function中,
而apply第二个参数是function接受的参数的数组,如果传入的第一个参数为 null,this 会指向默认的宿主对象,浏览器中为window。