# 2.7 This

## Example 1.

```javascript
var fullname = 'John Doe';
var obj = {
   fullname: 'Colin Ihrig',
   prop: {
      fullname: 'Aurelio De Rosa',
      getFullname: function() {
         return this.fullname;
      }
   }
};
 
console.log(obj.prop.getFullname());
 
var test = obj.prop.getFullname;
 
console.log(test());
```

**ANS：Aurelio De Rosa 和 John Doe** \
原因是，JavaScript中關鍵字this所引用的是函數上下文，取決於函數是**如何調用的**，而不是怎麼被定義的。 在第一個console.log()，getFullname()是作為obj.prop對象的函數被調用。因此，當前的上下文指代後者，並且函數返回這個對象的fullname屬性。相反，當getFullname()被賦值給test變量時，當前的上下文是全局對象window，這是因為test被隱式地作為全局對象的屬性。基於這一點，函數返回window的fullname，在本例中即為第一行代碼設置的。

## Example 2.

```javascript
var name = '全域';
var auntie = {
  name: '漂亮阿姨',
  callName: function() {
    console.log(this.name);
  },
};

(function() {
  var a = auntie.callName;
  a();
})();
```

**ANS：全域**

`a = auntie.callName` 函式間接參考，`a()` 為一般函式呼叫，因此 `this` 指向全域物件。

## Example 3.

```javascript
var myObject = {
    foo: "bar",
    func: function() {
        var self = this;
        console.log("outer func:  this.foo = " + this.foo);
        console.log("outer func:  self.foo = " + self.foo);
        (function() {
            console.log("inner func:  this.foo = " + this.foo);
            console.log("inner func:  self.foo = " + self.foo);
        }());
    }
};
myObject.func();
```

**ANS：**

```javascript
outer func: this.foo = bar
outer func: self.foo = bar
inner func: this.foo = undefined
inner func: self.foo = bar
```

在 outer 函式，this 和 self 都指向 myObject，因此輸出都是 bar，但在 inner 函式，**由於 IIFE 有自己的作用域**，因此 this 輸出為 undefined，但是 self 因為保存了 this 的指向，因此輸出為 bar
