在学习 javascript 的 this之前, 我们需要先明确一个重要知识:
在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了。
简单记忆是,谁调用的函数,this就指向谁.
在 javascript 中, this的取值,一般分为下面几种情况。
一. 构造函数
| 12
 3
 4
 5
 6
 7
 
 | function Foo(){this.name = "levon";
 this.age = 26;
 console.log(this);
 }
 
 var f1 = new Foo();
 
 | 
| 12
 3
 4
 5
 6
 7
 
 | function Foo(){this.name = "levon";
 this.age = 26;
 console.log(this);
 }
 
 Foo();
 
 | 
二. 函数作为对象的属性
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | var obj = {x : 10,
 fn : function(){
 console.log(this);
 console.log(this.x);
 }
 }
 
 obj.fn();
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | var obj = {x : 10,
 fn : function(){
 console.log(this);
 console.log(this.x);
 }
 }
 
 var fn1 = obj.fn;
 fn1();
 
 
 | 
- 需要注意的一种情况是下面的 f()函数, 此时 f()只是一个普通函数
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | var obj = {x : 10,
 fn : function(){
 
 this;
 
 function f(){
 console.log(this);
 console.log(this.x);
 }
 f();
 
 }
 }
 
 obj.fn();
 
 | 
三: 函数用 call 或 apply 调用
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | var obj = {x : 10
 };
 
 var fn = function(){
 console.log(this);
 console.log(this.x);
 }
 
 fn.call(obj)
 
 | 
四: 全局环境下的 this
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | console.log(this); 
 
 var x = 10;
 var fn = function(){
 console.log(this);
 console.log(this.x)
 }
 fn();
 
 | 
五: 原型链中的 this
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | function Fn(){this.name = "levon";
 }
 
 Fn.prototype.getName = function(){
 console.log(this.name);
 }
 
 var f1 = new Fn();
 f1.getName();
 
 | 
其实不仅仅是构造函数的prototype,即便是在整个原型链中,this代表的也都是当前对象的值。