//印出Window (指向全域物件)
console.log(this)
//呼叫a, 表示執行CODE property: 建立執行環境與this
//印出Window (指向全域物件)
function a(){
console.log(this)
//為全域物件增加屬性
this.newvvariable = 'hello';
}
a();
//函數表達式
var b = function(){
console.log(this)
}
//印出Window (指向全域物件)
b();
//呼叫hello
console.log(newvvariable);
//物件實體 (object literals)
var c = {
name: 'The c object'
log: function(){
console.log(this)
}
}
//印出Object {name: "The c object", Log: function}
c.log();
var c = {
name: 'The c object'
log: function(){
this.name = 'Update c object'
console.log(this)
}
}
//印出Object {name: "Update c object", Log: function}
c.log();
var c = {
name: 'The c object'
log: function(){
this.name = 'Update c object'
console.log(this)
//函數表達式: 預期會改變c的name
var setname = function(newname){
this.name = newname;
}
setname('Update again! The c object');
console.log(this);
}
}
//印出:
//Object {name: "Update c object", Log: function}
//Object {name: "Update c object", Log: function}
//setname沒有做任何事!
//但是全域物件中的name會被setname改變
c.log();
var c = {
name: 'The c object'
log: function(){
//this會指向c
//self, this都指向同一個記憶體位置
var self = this;
//將所有要用this的地方都改成self
self.name = 'Update c object'
console.log(self)
//函數表達式: 預期會改變c的name
var setname = function(newname){
//當函數裡沒有self變數時, 會往上一層找到self
self.name = newname;
}
setname('Update again! The c object');
console.log(self);
}
}
//印出:
//Object {name: "Update again! The c object", Log: function}
c.log();