# 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)
```