# 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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://jack1in.gitbook.io/font-end/2.-javascript/2.7-this.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
