zoukankan      html  css  js  c++  java
  • js 之 this的用法

    该篇文章混合了比较多文章,由于自己也水平有限,大家就将就着看下吧,详情可以参看《JavaScript语言精粹》,不过文章提供了很多例子,供大家参阅思考。

    首先关于this我想说一句话,这句话记住了this的用法你也就差不多都能明白了:this指的是当前函数的对象。这句话可能比较绕,我会举出很多例子和这句话呼应的!(看下文)
    1.首先看下面这段代码, 定义一个函数,弹下this,

    function doSomething(){
         alert(this);
    }
    doSomething();

    我是在firefox里面调试的,所以返回的结果是[Object Window]。
    那么这个 [Object Window], 到底是什么呢?看看下面的代码

    function doSomething(){
         alert(this===window);
    }
    doSomething();

    看到弹出了true, 也就是说在这种正常情况下,this其实就是window
    所以,我们定义了一个全局的变量的时候,可以
    var test="Tony";
    也可以
    window["test"]="Tony";
    下面这个例子,进一步说明,正常情况下,函数里的this就是window

    var test="Tony";
    function doSomething(){
         alert(this.test);     //弹出 "Tony";
         alert(window.test);   //弹出 "Tony";
    }
    doSomething();

    第一次呼应:通过以上几个例子,我想可以说这几个例子中得this指的就是他当前函数doSomething()的Window对象。那顾名思义this.test自然就等于window.test了。事实也是如此。


    2.我再举一个闭包的例子,但是在这里我不会解释什么是闭包,只是讲this的用法;
         看这个例子:

    var name ="The Window";                     //创建了一个全局变量name
    var object = {                       //又创建了一个对象(创建对象的方法有很多种)
          name:"My Object",                //创建了一个name属性(属性就是引用非函数)
          doSomething:function(){          //创建了一个doSomething方法(方法就是引用了函数)
                 return function(){       //这个doSomething方法返回一个匿名函数
                      return this.name;    //这个匿名函数又返回this.name
              };
        }
    };
    alert(object.doSomething()());
                                //由于这个doSomething方法返回的一个函数,所以这样就可以调用这个函数了

    这段代码的主要解释我都注在了后面,主要想说的就是:这段代码返回的结果是"The Window",而不是我所预期的"My Object",前面不是说了吗? this指的是当前函数的对象, 可是在这里为什么就不是呢?其实就是因为闭包的特性,由于这个匿名函数构成了一个闭包,所以他所保存的就是整个变量对象也就是Window对象。这里先不说为什么,明天学闭包的时候我还会用这个例子的,这里就先接受下来。
         那么如何做才能让结果返回"My Object"呢?还是那句话this指的是当前函数的对象,那么问题就简单了,也就是让this放在doSomething方法里,而不是那个匿名函数里不就可以了吗?修改代码如下:

    var name ="The Window";                    
    var object = {                      
         name:"My Object",              
         doSomething:function(){
               var abc = this ;        
               return function(){      
                      return abc.name;   
               };
          }
    };
    alert(object.doSomething()());

    第二次呼应:现在再看代码红色部分做的修改,this是不是指的是当前doSomething()函数的object对象了?那再输出结果自然就是"My Object"了。
          通过这两次呼应,是不是感觉已经对this有了一定的了解呢,其实this用到的地方还很多,以后还会慢慢讲到,比如在jQuery中this依然指的是当前函数的对象。

    其他一些关于this的例子,可以引起大家的思考

    第一个例子

    var value=3,vaa=3;
    var myobj={
        value:1,
        vaa:1,
    };
    myobj.double=function  () {
        var that=this;
        var helper=function(){
            that.value+=3;
        };
        helper();
    };
    myobj.double();
    console.log(myobj.value);  // 4
    
    myobj.doublet=function  () {
        var helpert=function(){
            this.vaa+=3;
            console.log(this);   //window
        };
        helpert();
    };
    myobj.doublet();
    console.log(myobj.vaa);   //1

    2、第2个例子

    【构造器调用模式】如果在一个函数面前带上new来调用,那么背地里将会创建一个连接到该函数的prototype成员的新对象,同时this会绑定到那个新对象上。

    new前缀也会改变return语句的行为。

    var Quo=function (string){
        this.status=string;       // this指向Quo
    };
    
    Quo.prototype.get_status=function(){
         return this.status;   //this指向Quo
    };
    
    var  myQuo=new Quo("confused");
    myQuo.get_status(); // confused
    myQuo.status="tttt";
    myQuo.get_status(); // ttt
     

    3、Apply调用模式

    apply方法让我们构建一个参数组传递给调用函数。它也允许我们选用this的值。apply方法接受两个函数,第一个是

    要绑定给this的值,第2个是一个参数组。

    var array=[3 ,4];
    var sum=add.apply(null,array); //sum=7
    //构建一个包含status成员的对象
    var statusObj={
        status:"A-OK"
    };
    //statusObj并没有继承自Quo.prototype,但我们可以在statusObj上
    //调用get_status方法,尽管statusObj并没有一个名为statusObj的方法。
    var status =Quo.prototype.get_status.apply(statusObj);
    //status的值为"A-OK"

    3、

    var MyClass = function(){
        this.name = "class";    
    }
     var obj = new MyClass();
     console.log( obj.name ); // class

    如果使用 new 调用构造器时,构造器显式地返回了一个 object 类型的对象,那么此次运算结果最终会返回这个对象,而不是我么之前期待的 this

    var MyClass = function(){
        this.name = "class";
        return {
            name: "other"
        }
    }
    var obj = new MyClass();
    console.log(obj.name); // other
  • 相关阅读:
    关于android studio
    Android 第三方开源库收集整理(转)
    Android酷炫实用的开源框架——UI框架(转)
    常用天气预报API接口整理(转)
    GitHub 优秀的 Android 开源项目(转)
    Android 初始化Setup Wizard——Provision
    Android使用的设计模式2——策略模式
    Android使用的设计模式1——观察者模式
    左手坐标系和右手坐标系
    Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换
  • 原文地址:https://www.cnblogs.com/huansky/p/5378918.html
Copyright © 2011-2022 走看看