克服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的奇怪部分
留言
張貼留言