Javascript - this

Javascript 中關於this的問題

在 Javascript - this and prototype 裡面已經有提到this的基本觀念

使用 Object literal 來宣告的物件內的function ,裡面的this 是指到物件本身

也就是 function 執行時期的所屬物件,

看一下以下這段Code,在log這個function裡面使用 function express(function literal)

再宣告了一個method : setNameWithFunction,

宣告完之後馬上呼叫,

const objectWithThis = {
  name: 'I am the object',
  log: function () {
    console.log(this.name);
    this.name = 'Update current object name'
    console.log(this.name);

    const setNameWithFunction = function(newName) {
      this.name = newName;
    };    
    setNameWithFunction('Update object name to "NEW NAME"');
    console.log(this.name);
  }
};

objectWithThis.log();

原先預期的結果,setNameWithFunction 應該要更改name的值,

但是執行結果卻是

修改一下上面的Code,看一下this指到的是什麼東西

const objectWithThis = {
  name: 'I am the object',
  log: function () {
    
    this.name = 'Update current object name'
    console.log(this);

    const setNameWithFunction = function(newName) {
      this.name = newName;
      console.log(this);
    };
    
    setNameWithFunction('Update object name to "NEW NAME"');
    console.log(this);
  }
};

objectWithThis.log();

執行結果=>

在setNameWithFunction這個method裡面的this指到的是window,

這是Javascript長久以來的問題,

解決方法如下

const objectWithThis = {
  name: 'I am the object',
  log: function () {
    // 宣告一個變數me來儲存this(by reference),
    // 確保裡面指到的都是物件objectWithThis本身
    let me = this;
    me.name = 'Update current object name'
    console.log(me.name);

    const setNameWithFunction = function(newName) {
      me.name = newName;      
    };    
    setNameWithFunction('Update object name to "NEW NAME"');
    console.log(me.name);
  }
};
objectWithThis.log();

這樣執行結果就如我們所預期

碰到物件方法中可能會有不知道 this 指稱到什麼的情況時,為了避免不必要的錯誤,

我們可以在該方法中的最上面建立一個變數,先去把原本的 this 保留下來(let me = this;)。