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

    this是Javascript语言的一个关键字。

    它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。比如,

      function test(){

        this.x = 1;

      }

    随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象。

    下面分四种情况,详细讨论this的用法。

    情况一:纯粹的函数调用

    这是函数的最通常用法(直接被调用),属于全局性调用,因此this就代表全局对象Global。

    请看下面这段代码,它的运行结果是1。

      function test(){

        this.x = 1;

        alert(this.x);

      }

      test(); // 1

    此时this就是全局对象,在函数被调用时,this.x 访问到全局变量x:

      var x = 1;

      function test(){

        alert(this.x);

      }

      test(); // 1

    再变一下, 在test里对this.x进行赋值可以看到,全局的x变量发生了改变:

      var x = 1;

      function test(){

        this.x = 0;

      }

      test();

      alert(x); //0

    情况二:作为对象方法的调用

    函数还可以作为某个对象的方法调用,这时this就指这个上级对象本身。

      function test(){

        alert(this.x);

      }

      var o = {};

      o.x = 1;

      o.m = test; //test 函数里的this将代表调用this的对象o

      o.m(); // 1

    情况三 作为构造函数调用

    所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象

      function test(){

        this.x = 1;

      }

      var o = new test();

      alert(o.x); // 1

    运行结果为1。为了表明这时this不是全局对象,我对代码做一些改变:

      var x = 2;

      function test(){

        this.x = 1;

      }

      var o = new test();

      alert(x); //2, 全局对象x没有被影响

    运行结果为2,表明全局变量x的值根本没变。

    下面的例子表明,在执行了test的构造函数后,o.x的赋值被构造函数改变:

    var x = 7;
    function test(){
    	this.x = 0;
    	//alert(this.x); //一定是0
    }
    
    var o = {};
    
    o.x = 2;  
    alert(o.x); //2
    o.m = test; o.m(); alert(o.x);// 0, 被test修改了o的属性x为0 o.x = 6; alert(o.x);// 6, 被新赋值的对象o的属性x alert(this.x); //7, 全局的变量x

      

    情况四 apply调用

    apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。

      var x = 0;

      function test(){

        alert(this.x);

      }

      var o={};

      o.x = 1;

      o.m = test;

      o.m.apply(); //0

    apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。

    如果把最后一行代码修改为

      o.m.apply(o); //1

    运行结果就变成了1,证明了这时this代表的是对象o。

  • 相关阅读:
    HDU 1009 FatMouse' Trade
    HDU 2602 (简单的01背包) Bone Collector
    LA 3902 Network
    HDU 4513 吉哥系列故事——完美队形II
    LA 4794 Sharing Chocolate
    POJ (Manacher) Palindrome
    HDU 3294 (Manacher) Girls' research
    HDU 3068 (Manacher) 最长回文
    Tyvj 1085 派对
    Tyvj 1030 乳草的入侵
  • 原文地址:https://www.cnblogs.com/xiami303/p/3238359.html
Copyright © 2011-2022 走看看