克服JS - this


this 在 Javascript 裡面是一個容易令人誤會,也十分令人困惑的字。
它在不同的位置上所代表的東西不一定是這麼直觀的,直白的翻譯 this 是這個的意思。
我一開始使用的時候,一直覺得它就是指當下把它包起的東西,物件也好,函式也好,但看來並不是這樣(笑)...




function a() {
  console.log(this);
}

a();
// Window{...}

function b() {
  this.test = 'hello';
}
console.log(this.test);
// 'hello'

this指的是Global Object,而另一個函式內的this也指向的是同一個Global Object。
var c = {
  name: 'The c obj',
  log: function() {
    console.log(this);
  }
}

c.log();
// {name:'The c obj', log:function}
這裡的this則指的是c這個物件。
var c = {
  name: 'The c obj',
  log: function() {
    this.name = 'Updated c object';
    console.log(this);
  }
}

c.log();
// {name:'Updated c object', log:function}
因此可以變動物件c內的name。
var c = {
  name: 'The c obj',
  log: function() {
    this.name = 'Updated c object';

  var setname = function(newname) {
    this.name = newname;
  }
  setname('new name yes!');
  console.log(this);
  }
}

c.log();
//{name:'Updated c object', log:function}
console.log(this.name);
// 'new name yes!'
setname函式的this卻指向global object...
而這種狀況呢,就會再log函式內加入一個變數指向c物件來代替this。
var c = {
  name: 'The c obj',
  log: function() {
    var self = this;
    self.name = 'Updated c object';

    var setname = function(newname) {
        self.name = newname;
    }
    setname('new name yes!');
    console.log(self);
  }
}

c.log();
//{name:'new name yes!', log:function}
如此一來,setname函式變更的即是c物件內的name,這樣的作法也是常見的pattern唷。

reference: Udemy 克服JS的奇怪部分

留言

這個網誌中的熱門文章

Django - admin 的設定筆記

[Python] 以folium製作臺灣百岳資訊地圖

交個筆友吧!老派的浪漫與科技之結合 - SLOWLY