鍍金池/ 問答/HTML/ 關(guān)于this的指向問題

關(guān)于this的指向問題

看了很多博客對this的指向很迷糊,今天看博客也有些不太理解的地方,希望大家能指點(diǎn)一下。
貼上代碼:

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

我的理解是這樣的,首先這是一個對象方法調(diào)用。當(dāng)調(diào)用moveTo(1,1)的時候this指向point的,但是當(dāng)執(zhí)行moveX(x); moveY(y)后。里面的this應(yīng)該發(fā)生了改變了,并沒有指向point,所以point.x還是等于2.而且多了兩個全局變量x,y。我想問的是,this發(fā)生了改變嗎?為什么會出現(xiàn)兩個全局變量。

回答
編輯回答
你好胸

moveTo、moveX、moveY都沒有定義this指向,所以它們運(yùn)行時的this指向取決于在調(diào)用函數(shù)時運(yùn)行環(huán)境的this指向,就你寫的代碼而言,你調(diào)用的時候this指向window,所以運(yùn)行時它們的this都是window,也就出現(xiàn)兩個全局變量
moveTo的this從來就沒有指向過point

2018年6月13日 17:23
編輯回答
乖乖噠

moveX,moveY 是從 moveTo 中聲明的,只能為 moveTo 內(nèi)所用,不存在調(diào)用的對象,只能指向 window
而 moveTo 的 this 是通過 Point 調(diào)用的,所以 this 指向是 Point。

如果想要修改 Point X, Y 的結(jié)果,只能將 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,當(dāng) moveTo 被調(diào)用的時候,在 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);
2017年3月4日 18:07
編輯回答
笨小蛋

沒有確定的調(diào)用對象的話,默認(rèn)指向 global,在瀏覽器里就是 window,所以此時 this.x = x 等效為 window.x = x,等效于創(chuàng)建了全局變量。

2018年3月24日 10:25