---
# System prepended metadata

title: 克服 JS 奇怪的部分 25. IIFEs，立即呼叫的函數表示式
tags: ["JavaScript\_", JavaScript 基礎]

---

### (IIFE)s 是什麼？

- 我們已經認識了陳述式 & 表達式：

### 1. 陳述式：
   - 當我們宣告這段函數時，JavaScript 會將此函數 greet() 放入記憶體中，但不會馬上被執行。
```js
// function statement
function greet(name) {
  console.log(`hello` + name);
}

// 你需要呼叫函數時，陳述式函數才會被執行。
greet("Ted");
```

### 2. 表達式：
   - 這段代碼不像陳述式函數會立刻被放在記憶體中，而是執行了這個變數以後，創造這個函數物件，去執行它。
   - 並且用**指向它的記憶體變數來執行**。
     - 也是目前最多人在使用的(React)。
```js
// using a function expression
var greetFunc = function (name) {
  console.log(`hello ` + name);
};

greetFunc("Wilson");
```

### 3. IIFEs，立即調用表達式：

```js
var greeting = (function (name) {
  console.log("Hello " + name);
})("Ted");

//立即調用函數。在函數表達式的末尾使用括號 ()，表示立即調用該函數。這意味著該函數會立即執行。

// outpus:
Hello Ted
```
- 不使用 IIFEs 的表達式：
  - 輸出一段函數內容，但沒有實際執行 `return` 內容。
```js
var greeting = function (name) {
  return `Hello ` + name;
};

console.log(greeting);

// outputs:

ƒ (name) {
  return `Hello ` + name;
}
```
### 更正確地獲取結果方式：

```js
var greeting = (function (name) {
  return `Hello ` + name;
})("Ted");

console.log(greeting);

// Hello Ted
```

- 簡單來說，IIFEs 立即函數，可以避免作用域污染的問題
  使函數在執行以後就立刻被銷毀，實務上相當的便利。

