涵义

this都有一个共同点:它总是返回一个对象。

  1. var person = {
  2. name: '张三',
  3. describe: function () {
  4. return '姓名:'+ this.name;
  5. }
  6. };
  7. person.describe()
  8. // "姓名:张三"
  1. <input type="text" name="age" size=3 onChange="validate(this, 18, 99);">
  2. <script>
  3. function validate(obj, lowval, hival){
  4. if ((obj.value < lowval) || (obj.value > hival))
  5. console.log('Invalid Value!');
  6. }
  7. </script>

上面代码是一个文本输入框,每当用户输入一个值,就会调用onChange回调函数,验证这个值是否在指定范围。浏览器会向回调函数传入当前对象,因此this就代表传入当前对象(即文本框),然后就可以从this.value上面读到用户的输入值。

  1. var f = function () {
  2. console.log(this.x);
  3. }
  4. var x = 1;
  5. var obj = {
  6. f: f,
  7. x: 2,
  8. };
  9. // 单独执行
  10. f() // 1
  11. // obj 环境执行
  12. obj.f() // 2

上面代码中,函数f在全局环境执行,this.x指向全局环境的x;在obj环境执行,this.x指向obj.x。

如果对象的方法里面包含this,this的指向就是方法运行时所在的对象。该方法赋值给另一个对象,就会改变this的指向。

  1. var obj ={
  2. foo: function () {
  3. console.log(this);
  4. }
  5. };
  6. obj.foo() // obj

如果this所在的方法不在对象的第一层,这时this只是指向当前一层的对象,而不会继承更上面的层。

  1. var a = {
  2. p: 'Hello',
  3. b: {
  4. m: function() {
  5. console.log(this.p);
  6. }
  7. }
  8. };
  9. a.b.m() // undefined

上面代码中,a.b.m方法在a对象的第二层,该方法内部的this不是指向a,而是指向a.b,因为实际执行的是下面的代码。

  1. var b = {
  2. m: function() {
  3. console.log(this.p);
  4. }
  5. };
  6. var a = {
  7. p: 'Hello',
  8. b: b
  9. };
  10. (a.b).m() // 等同于 b.m()