---
# System prepended metadata

title: JS 讀書會解答

---

# JS 讀書會解答

## 題目 1

``` javascript
// 執行環境
var father = 1
function foo (x) {
	var sister = x * 4
	function bar (y) {
		var brother = y * sister 
		return brother
	}
	return bar(sister)
}

console.log(foo(father))
console.log(brother)

```
### 解答
``` javascript
16
brother is not defined
```

### 詳解
``` javascript
var father = 1  // 定義 father = 1
function foo (x) { // x = father = 1
	var sister = x * 4 // sister = 1 * 4 = 4
	function bar (y) { // y = sister = 4
		var brother = y * sister  // brother = 4 * 4 = 16
		return brother // 回傳 brother = 16
	}
	return bar(sister) // 呼叫 function，傳 sister 的值進去
}

console.log(foo(father)) // 呼叫 function，傳 father 的值進去
console.log(brother) // brother 是函式變數，所以全域裡面呼叫不到 brother
```

### 執行順序(參考用)
```javascript=
var father = 1
console.log(foo(father))
function foo (1) {
	var sister = 1 * 4
	function bar (4) {
		var brother = 4 * 4 
		return 16
	}
	return bar(4)
}
console.log(brother)
```

## 題目 2

``` javascript
// 展開運算元 | 其餘運算子

function pilicapililala( { name, question, bad, ...rest } ) {
		console.log(`/${name}問 =`, question)
		console.log(`/${name}壞 =`, bad)
		console.log(`/${name}不行 =`, rest.nono)
		const bigACE = {name: name, dream: `我長大嚕，我已經${rest.age + 1}歲了`}
		return  bigACE 
}

const ace = {
	name: 'ace',
	age: 27,
	city: '高雄',
	question: '我是不是都不知道我在問什麼',
	bad: '一人一信，告訴他媽媽',
	nono: '不行跟阿母講'
} 

const { name, dream, ...rest} = pilicapililala(ace)
console.log(name)
console.log(dream)
console.log(rest)

const bobolinababaludo = {
	...ace,
	bad: '對呀～～～ ace壞壞 騙騙仔！哈哈哈'
}

console.log(ace)
console.log(bobolinababaludo)
```

### 解答
``` javascript
/ace問 = 我是不是都不知道我在問什麼
/ace壞 = 一人一信，告訴他媽媽
/ace不行 = 不行跟阿母講
ace
我長大嚕，我已經28歲了
{}
{
	name: 'ace',
	age: 27,
	city: '高雄',
	question: '我是不是都不知道我在問什麼',
	bad: '一人一信，告訴他媽媽',
	nono: '不行跟阿母講'
} 
{
	name: 'ace',
	age: 27,
	city: '高雄',
	question: '我是不是都不知道我在問什麼',
	bad: '一人一信，告訴他媽媽',
	nono: '不行跟阿母講',
	bad: '對呀～～～ ace壞壞 騙騙仔！哈哈哈'
} 
```

### 詳解
```javascript=
// 展開運算元 | 其餘運算子

function pilicapililala( { name, question, bad, ...rest } ) { 
    // ...rest 會是剩餘物件，所以 rest = { age: 27, city: '高雄', nono: '不行跟阿母講' }
		console.log(`/${name}問 =`, question) // name = 'ace', question = '我是不是都不知道我在問什麼'
		console.log(`/${name}壞 =`, bad) // name = 'ace', bad = '一人一信，告訴他媽媽'
		console.log(`/${name}不行 =`, rest.nono) // name = 'ace', rest.nono = '不行跟阿母講'
		const bigACE = {name: name, dream: `我長大嚕，我已經${rest.age + 1}歲了`} // rest.age = 27
		return  bigACE // bigACE = {name: 'ace', dream: `我長大嚕，我已經28歲了`}
}

const ace = {
	name: 'ace',
	age: 27,
	city: '高雄',
	question: '我是不是都不知道我在問什麼',
	bad: '一人一信，告訴他媽媽',
	nono: '不行跟阿母講'
} 

const { name, dream, ...rest} = pilicapililala(ace) 
// 呼叫 function，傳 ace 的值進去
// 這時候的 function 已經回傳 bigACE 這個物件了
// bigACE = {name: 'ace', dream: `我長大嚕，我已經28歲了`}
// name = 'ace', dream = '我長大嚕，我已經28歲了'
// rest 是剩餘參數，這時候已經沒有剩下的參數，所以會是空物件
console.log(name) // name = 'ace'
console.log(dream) // dream = '我長大嚕，我已經28歲了'
console.log(rest) // rest = {}

const bobolinababaludo = {
    // 相同的參數可以直接用 ...參數 的方式直接引入進來
    // 這對於物件或陣列的操作非常實用
	...ace, // 原本的 ace 物件
	bad: '對呀～～～ ace壞壞 騙騙仔！哈哈哈' // 加上 bad 這個 key & value 
}

console.log(ace)
console.log(bobolinababaludo)
```

### 執行順序(參考用)
```javascript=
const ace = {
	name: 'ace',
	age: 27,
	city: '高雄',
	question: '我是不是都不知道我在問什麼',
	bad: '一人一信，告訴他媽媽',
	nono: '不行跟阿母講'
}
const { name, dream, ...rest} = pilicapililala(ace)
function pilicapililala( { name, question, bad, ...rest } ) {
		console.log(`/${name}問 =`, question)
		console.log(`/${name}壞 =`, bad)
		console.log(`/${name}不行 =`, rest.nono)
		const bigACE = {name: name, dream: `我長大嚕，我已經${rest.age + 1}歲了`}
		return  bigACE 
}
console.log(name)
console.log(dream)
console.log(rest)

const bobolinababaludo = {
	...ace,
	bad: '對呀～～～ ace壞壞 騙騙仔！哈哈哈'
}

console.log(ace)
console.log(bobolinababaludo)
```