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