关于this的指向问题

看了很多博客对this的指向很迷糊,今天看博客也有些不太理解的地方,希望大家能指点一下。
贴上代码:

var point = {
    x : 2,
    y : 2,
    moveTo : function(x, y) {
      var moveX = function(x) {
        this.x = x;
      };

      var moveY = function(y) {
        this.y = y;
      };
      moveX(x);
      moveY(y);
 }
  };
  point.moveTo(1, 1);
  console.log(point.x); //==>2
  console.log(point.y) //==>2
  console.log(x); //==>1
  console.log(y); //==>1

我的理解是这样的,首先这是一个对象方法调用。当调用moveTo(1,1)的时候this指向point的,但是当执行moveX(x); moveY(y)后。里面的this应该发生了改变了,并没有指向point,所以point.x还是等于2.而且多了两个全局变量x,y。我想问的是,this发生了改变吗?为什么会出现两个全局变量。

阅读 1.7k
3 个回答

没有确定的调用对象的话,默认指向 global,在浏览器里就是 window,所以此时 this.x = x 等效为 window.x = x,等效于创建了全局变量。

moveTo、moveX、moveY都没有定义this指向,所以它们运行时的this指向取决于在调用函数时运行环境的this指向,就你写的代码而言,你调用的时候this指向window,所以运行时它们的this都是window,也就出现两个全局变量
moveTo的this从来就没有指向过point

moveX,moveY 是从 moveTo 中声明的,只能为 moveTo 内所用,不存在调用的对象,只能指向 window
而 moveTo 的 this 是通过 Point 调用的,所以 this 指向是 Point。

如果想要修改 Point X, Y 的结果,只能将 moveX,moveY 的值使用 return 返回给 this

var point = {
    x : 2,
    y : 2,
moveTo : function(x, y) {
  var moveX = function(x) {
    return x;
  };

  var moveY = function(y) {
    return y;
  };
thix.x=moveX(x);
this.y=moveY(y);
  };
  point.moveTo(1, 1);
  

或者将 moveTo 中的 var 修改为 this,当 moveTo 被调用的时候,在 Point 对象中声明 moveX, moveY。
这时候在 moveTo 中使用 moveX, moveY 时,需要改为 this.moveX, this.MoveY。

var point = {
    x : 2,
    y : 2,
    moveTo : function(x, y) {
      this.moveX = function(x) {
        this.x=x;
      };

      this.moveY = function(y) {
        this.y=y;
      };
      this.moveX(x);
      this.moveY(y);
 }
  };
  point.moveTo(1, 1);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题