理解javascrpit中的this

javascript中的this是根据程序的上下文环境变化的,可以分为以下两种情况:

1.如果this所在的函数是直接被调用的,则this指向的是该函数所在上下文的对象。

2.如果this所在的函数是一个对象中的函数,则this指向的是拥有该函数的对象。以下举例说明:

假设有一js函数,其使用了一个this.num变量

var num= 1;

function testThis()

{

    alert(this.num);

}

1.直接调用testThis()

   //this指向的是调用该函数的上下文中的对象,则this.num指向的是调用该函数的上下文中的num

2.将testThis赋值给一个变量后再调用

   var myTestThis = testThis;

   myTestThis();//this指向的和直接调用testThis()一样,都为该函数所在上下文的对象。

3.将testThis赋值给一个对象的属性

   var myObj = {};

   myObj.num = 2;

   myObj.myTestThis = testThis;

   myObj.myTestThis ();//由于myTestThis是myObj对象的一个属性,则this指向的是拥有myTestThis属性的对象myObj

                                    //则this.num表示的是myObj.num

理解了以上三个例子,再看看是否可以理解下面两个例子:

   var name = "The Window";

   var object = {
 name : "My Object",

 getNameFunc : function(){
   return function(){
     return this.name;
        };

        function() func2 {
     return this.name;
        };

        return func2;

       }

   };

 alert(object.getNameFunc()());//注意调用该函数后面一定是两个括号()()

   这里涉及到了一个javascript中的一个概念:‘闭包’,简单来说闭包就是在一个函数内部调用另一个函数,该函数内部的函数中又使用了外层函数中的变量,对于这个object.getNameFunc()()函数调用来说,getNameFunc就是一个闭包,他的内部没有定义变量,所以this指向的是全局空间中的name变量,也即'The Window'。

    var name = "The Window";

  var object = {
  name : "My Object",

  getNameFunc : function(){
    var that = this;
    return function(){
      return that.name;
        };

      }

    };

  alert(object.getNameFunc()());

    这里,getNameFunc依旧是一个闭包,不同的是在getNameFunc内部,他引用了this变量,类似于上面例子3,此时的this指向的是拥有getNameFunc方法的对象object,that = this,则that指向的也即object,that.name即'My Object'。

 

    最后,关于js中的闭包可以参考这个网址:http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

本文的最后两个例子就是从这篇文章中摘过来的。

 

你可能感兴趣的:(JavaScript,object,function)