---
# System prepended metadata

title: 20200805 Astro camp javascript  泰安老師
tags: [Astro Camp, ' function', ' javascript']

---

---
title: 20200805 Astro camp javascript  泰安老師
tags: Astro Camp, javascript, function 
---
# 20200805 Astro camp javascript  泰安老師

變數只有在第一次宣告的時候需要用let
第二次之後就不用了
```javascript=
let x = 10;
let y = "100";

let userName = "John";
let greeting = "Hello, " + userName + ", how are you.";
let greeting2 = `Hello, ${userName}, how are you.`;

x = 999;
y = `test`; // grave, backtick

let z = x + y;
console.log(z);


```

## var 跟 let 的差別

如果用var，會讓在block裡的變數去汙染到外面的語法。
(用var在宣告變數時，範圍的概念較模糊，而let較明確)
在function裡用var宣告變數，就只會在fuction裡拿到。
let 是較新的語法，較舊的瀏覽器不支援。

```javascript=
function bar(x) {
  for (var j = 0; j < x; j++) {
    // 1. 拿得到 j
  }
  // 2. 拿得到 j
}
// 3. 拿不到 j

```
```javascript=
function bar(x) {
  for (let j = 0; j < x; j++) {
    // 1. 拿得到 j
  }
  // 2. 拿不到 j
}
// 3. 拿不到 j

```
```javascript=
function bar(x) {
  for ( j = 0; j < x; j++) {
    // 1. 拿得到 j
  }
  // 2. 拿得到 j
}
// 3. 拿得到 j

```
^ 可怕 別用！
## 變數提升
用javascript宣告變數時：
`var userName = "John Doe"`
事實上做了兩件事：
```javascript=
//var userName;//

console.log(userName);

var userName; //先宣告一個變數，並把宣告變數的行為放在檔案的最上面！

userName = "John Doe"; // 接下來再指派值給他
```
所以在這個情況中，運行後，不會噴錯，但會噴undified!


下面會動，function後面接名字時，整個function會被拉到檔案最上面設定！

```javascript=
baz(1000)

// a lot of codes

function baz(x){
  var amount, total, qty;

  //do something
  amount = 100;
  console.log(amount + x)
}
```

## 函式(像販賣機)
函示只能有一個回傳值，一旦回傳就不會往下跑了，Ruby 的 方法最後一行就是回值，Javascript，要手動打出return，說要回傳甚麼。
### JS function跟Ruby method的差別

Ruby內 所有的method都隸屬於某個物件，而function是自由的！可以把function指定給任何的東西，也可以放在任何符合語法的地方


### 設定function的方式有三種
1. 設定有名字的function
```javascript=
putInPot('beef')
   
  function putInPot(x) {
    console.log(`${x} in pot`)
  }
```
2. 指定名字給無名function

```javascript=
let lalala = function (x) {
  console.log(`${x} in pot`)
}
```
3. 用胖火箭(箭號函式)
```javascript=
// ES6
let addOne = function(x) {return x + 1}
// 1. function拿掉把箭號放在原括號跟花括號中間
// 2.若傳進來的參數只有一個，則圓括號可以省略
let addOne2 = x => {x + 1}
// 若有兩個參數則圓括號不能省略
let addOne = (x, y) => {x +  y + 1}
// 3.若function body只有一行，且
```

### 高階函式(處理函式的函式)
簡化下面的code
```javascript=
putInPot('beef');
putInPot('water');
console.log('I make dinner with beef')

boomboom('chicken')
boomboom('coconut');
console.log('I make dinner with chicken')

function putInPot(x) {
  console.log(`${x} in pot`)
}

function boomboom(x) {
  console.log(`cooking ${x}`)
}
```
仔細看看會發現就是我丟了(一個材料給putInPot)兩次，然後console.log一次，再丟了(一個材料給boomboom)兩次，然後console.log一次，形式幾乎一模一樣，設定一個高階函式(cook)來處理吧！
```javascript=
cook('beef', 'water', putInPot);
cook('chicken', 'coconut', boomboom);

function cook(i1, i2, f) {
  f(i1)
  f(i2)
  console.log(`I make dinner with ${i1}`)
}

function putInPot(x) {
  console.log(`${x} in pot`)
}

function boomboom(x) {
  console.log(`cooking ${x}`)
}
```
