最近做项目,用到公司内部一个轻量级框架,基于面向对象。既然是面向对象,肯定少不了this关键字,而js是非面向对象语言,因此this在使用过程中经常遇到一些特殊的问题,下面就说说我对this的理解。

Js中函数有自己的属性,因为js中一切皆对象。而thisarguments是函数的内部属性,在函数定义的时候自动产生。我们经常说this指向当前对象,也就是说this指向调用他的前一个对象。

This的指向分类

1.普通的函数调用

    //单纯的函数调用,this指向window
    function show(){
        this.x=1;
        console.log(this.x);
        console.log(this);
    }
    show();

2.作为对象方法调用

    //函数作为构造函数,this指向函数创建的当前实例
    function test(){
    console(this);
  }
  var o = {};
  o.x = 1;
  o.m = test;
  o.m(); 

3.函数作为构造函数

    //函数作为构造函数,this指向函数创建的当前实例
    function Test(){
    this.name='name';
    this.age=14;
    this.show=function(){
        console.log(this);
    }
    }
    var test=new Test();
    test.show();

4.定时器中的this指向为window

    //定时器中的this指向window
    var a=1;
    var obj={
        a:2,
        speak:function(){
            console.log(this.a)
              }
    }
    setTimeout(obj.speak,20);
setTimeout()函数调用可以简单的理解为setTimeout(fn,20){fn();}

过关检测

为了检验是否理解了this的内涵,这里有两个测试题,请指出console.log(x)的值

    //demo1
    var x=1;
    function test(){
    this.x=2;
    }
    test();
    console.log(x);


    //demo2
    var x=1;
    function Test(){
    this.x=2;
    }
    var test=new Test();
    console.log(x);