# 迴圈/函式/變數
[TOC]
### for迴圈
三個 expression 的變形
#### Expression1:在執行迴圈前先執行,通常用來宣告迴圈變數
a.可多個,以逗號隔開
```javascript!
for(let i=0,len = classA.length; i < ien ; i++){
console.log(classA[i]);
}
```
b.可省略,直接寫分號
```javascript!
let i = 0;
for (; i < classA.length; i++){
console.log(classA[i]);
}
```
#### Expression2:執行迴圈的條件(true才進去迴圈,一但false就停止)
a.可省略,但必須搭配break,否則會變成無窮迴圈
```kotlin!
for (let i =0 ; ; i++){
if (i>= classA.length){
break;
}
console.log(classA[i]);
}
```
#### Expression3:每次回圈執行完後要做的事,通常擁來更新回圈變數
a.可省略,把變數更新放在迴圈裡面做
```javascript!
for (let i=0; i < classA.length;){
console.log(classA[i]);
i++;
}
```
### a++ / ++a
a++:先賦值,再把 a+1
++a:a+1,再賦值
以上兩者a都會+1,但是在有賦值的情況下會有差別
```javascript!
範例:
let a = 1;
let b = a++;
a=2,b=1
let a = 1;
let c = ++a;
a=2,c=2
```
### a-- / --a
a--:先賦值,再把 a-1
--a:先把 a-1,再賦值
以上兩者a都會-1,但是在有賦值的情況下會有差別
```javascript!
範例:
let a = 2;
let b =a--;
結果 a=1,b=2
let a = 2;
let c = --a;
結果 a=1,c=1
```
```javascript!
for(let i = 0,i< classA.length;){
console.log(classA[i]);
i++;
}
可改寫為
for(let i = 0; i < classA.length;){
console.log(classA[i++]);
}
console先印出classA[i]後,再把 i+1
但如果改成++i?
會先把i+1後,才印出console,此處將導致i會超出classA的索引
```
### break & continue
#### break 跳出迴圈
```
for (let i =0 ; i++){
if (i >= classA.length)
break;
}
console.log(classA[i])
}
```
#### continue 跳到迴圈的下一次
情境:A班的第三位同學今天缺席,點名表不需要印出他的名字
```
for (let i = 0 ;i < classA.length ; i++){
if( i == 2){
continue;
}
console.log(classA[i]);
}
```
### for in 迴圈
```javascript!
for ( key in object / array){
//code block to be executed
}
> The for in loop iterates over an object or array
若 iterate(迭代)對象是array,會拿到的是index(索引值)
得到的index不一定會照順序,如果順序很重要的話請問使用for in 迴圈
```
```javascript!
let students = [ "Jessie","John","Josh","Allen","Claire","Betty"];
for( let idx in students){
console.log(students[idx]);
}
```
### for of 迴圈
```javascript!
for( key of iterable){
// code block to be executed
}
```
會拿到的是值,而非index(索引值)
得到的值會照順序
```javascript!
for (let std of students){
console.log(std);
}
```
### while 迴圈
```javascript!
while(condition){
// code block to be executed
}
```
只要condition一直是true,就不斷執行迴圈
condition沒寫好可能導致無窮迴圈
範例:
```javascript!
let students = ["Jessie","John","Josh","Allen","Claire","Betty"];
let i = 0;
while( i < studnets.length){
console.log(students[i++]);
}
```
### Function 函式
定義:一段執行特定任務的程式碼
架構
```
function 函式名稱(變數){
要執行的程式碼
}
```
### 變數 parameters
放在()中,多個變數要用逗號隔開
parameters會是local variables只能在此funtion中使用
主程式碼:放在()中M表示這個韓式要執行的任務,撰寫方式跟一般完全相同
return:函式的回傳值,呼叫這個函式可拿到回傳值
**如果function只是要做一些動作,也可以不用回傳
執行:function內的程式碼一定要「被呼叫」才會執行
執行function的必要條件:
funtion函式本身:相當於一個黑盒子,把要做的動作包在盒子裡,讓別人去使用它。別人不需要管盒子裡面在做什麼事,只需要按照規定傳入參數後,就可以拿到回傳值
```
function multiplier(a,b){
return a*b;
}
```
caller呼叫者:透過()來呼叫要使用的function,()裡面要傳入對應的參數
`let result = multipilier (4,7);`
**沒有加入()不會呼叫function,只會取得該funtion的內容(程式碼)
為什麼要用function?
任務明確(透過function名稱即可知道任務是什麼)
方便維護
減少重複的程式碼