谈谈 JavaScript 中的 this 指向问题

     JavaScript 中的 this 为一个重难点,它不像静态语言 C#、Java 一样,就表示当前对象。而在 JS 中, this 是运行时确定,而并非定义时就已确定其值。

     谈起 this ,必须少不了 JavaScript 另一个重点:函数,在 JS 中函数有以下几种定义方法。

 

 1   // 函数声明
 2     function fun(){
 3         
 4     }
 5     
 6    // 函数表达式
 7     var fun=function(){
 8         
 9     };
10     
11     // Function 构造函数 
12     var fun=new Function (arg1, arg2, ... argN, functionBody)  arg1 arg2 .... 为函数形参  functionBody 为函数主体

 

 一   this 指向 window  

 

 1 function  f(){
 2 
 3   console.dir(this);
 4   console.dir(this.f===f);
 5   console.dir(this===window)
 6 
 7 }
 8 
 9 f();
10 
11 // 此时,可视 f 为 window 对象下定义的一个属性,f() 可视为由 window 进行调用,此时,this 即指向 window

 

 

    二   this 指向当前对象

   

 1 var obj={name:"jack",age:20,say:function()
 2 {
 3   console.dir(this);
 4  console.dir(this===obj);
 5  alert(this.name);
 6 
 7 }};
 8 
 9 obj.say();
10 
11 // 通过 obj 对象调用 say 方法,而此时 say 方法即指向当前对象

 

 

 三  this 指向通过构造器函数所创建的对象

   

 1 var Person=function(name,age)
 2 {
 3   this.Name=name;
 4   this.Age=age;
 5   console.dir(this);
 6   
 7 };
 8 
 9 new Person("jack",20);
10 
11 Person("jack",20);
12 
13 // 前者通过 new 关键词,调用 Person 函数,此时,this 指向当前构造器函数所创建的对象
14 
15 
16 // 而后者,直接调用 Person 函数,参考第一条,可视为 window.Person(),此时,this 指向 window

 

 

 

 四   this 在原型中,指向通过该构造器函数创建的对象(同 new )

   

 1 var Person=function(name,age)
 2 {
 3    this.Name=name;
 4    this.Age=age;
 5 
 6 };
 7 
 8 Person.prototype.say=function()
 9 {
10    console.dir(this);
11   
12 
13 }
14 
15 new Person(“jack”,20).say();
16 
17 // 首选,以 Person 为构造器创建对象,再调用 say 方法,此时,this 指向以该构造器造建的函数对象

 

       最后,看看几个容易引起误解的地方 ,有关该函数中 this 指向,关于以下两个,本人仅仅通过 chrome 控制台及调试,原理性感觉用 Java、C# 的无法解释。

  

 1 var f={name:'jack',age:20,say:function()
 2 {
 3   console.dir(this);
 4   console.dir(this.name);
 5 
 6 }};
 7 
 8 var f1=f.say;
 9 
10 f1();
11 
12 console.dir(window.name);
13 
14 
15 // 将 f 对象中 say 属性(say 为函数)赋值给 f1 变量,而此时,通过 f1()调用,此时,this 指向 window,并非 f 对象

 

 


 

 1 var f=function()
 2  {
 3    console.dir(this);
 4 
 5    var f1=function()
 6    {
 7 
 8     console.dir(this);
 9     console.dir(this===f);
10 
11    };
12 
13     f1();
14 
15  };
16 
17 f();
18 
19 // 在函数中,再定义一个函数时,同时,在外层函数中调用该函数,而此时 ,this 并非指向外层函数对象,而是指向 window

 

 

 

 参考资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions

 

  
 

posted @ 2016-03-25 16:09  Lumia1020  阅读(348)  评论(2编辑  收藏  举报