理解javascrpit中的this

    技术2022-05-19  31

    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

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

     


    最新回复(0)