1. 程式人生 > >ECAM6--變數與函式

ECAM6--變數與函式

LET 關鍵字

用來替代了var的關鍵字

【特性】
  1. 不允許重複宣告
  2. 沒有預解析
  3. 塊級作用域(遇到{}就會產生作用域)
【作用域】

一對 =={ }== 包括的區域稱之為程式碼塊
塊級作用域指一個變數或函式只在該區域起作用

【Dome1】

console.log(a);//會報錯,a is not defined
let a = 3;//原來如果用var宣告到呼叫後,不會報錯,而是undefined,說明用var預解析了,但是用let不會

【Dome2】

//如果申明i的時候用原來的var,則每次定時器打出來的都是i,之前解決的方案就是利用函式的自執行,將每次的i傳入函式中使用,但是如果用let申明i,就解決了問題,打出了0-9的數字。同樣,也可以用在選項卡的例子中
for(let i=0; i<10; i++){
    setTimeout(function(){
        console.log(i)
    },50); 
}

const 宣告常亮

在定義之後值是固定不變的,即為常量
常量的值不能修改,但是如果常量儲存的是一個物件,那麼物件的屬性是可以被修改

可以理解為,物件本身是在堆記憶體中,它的值本身是可以修改的,但是它的引用地址在棧記憶體中,一旦用const申明後,引用地址是不能改的
【Dome】

const a = 1;
a = 2;
console.log(a);
//會報錯:TypeError: Assignment to constant variable.
const a = 1;
a = 2;
console.log(a);
//會報錯:TypeError: Assignment to constant variable.

var存在的問題

  1. 可以重複宣告
  2. 無法限制修改

    程式碼的限制,嚴謹性可以開發大型專案

  3. 沒有塊級作用域

let 與 const

  • 共同點:不能重複宣告
  • 不同:一個變數/一個常量

塊級作用域

  var btn = document.getElementsByTagName('button')
    console.log(btn);
    window.onload = function(){
            for(var i = 0; i < btn.length; i++) {
                (function(i){
                    btn[i].onclick = function(){
                        alert(i)
                    }
                })(i)
            }
    }
let btn = document.getElementsByTagName('button')
    console.log(btn);
    window.onload = function(){
       for(let i = 0; i < btn.length; i++){
            btn[i].onclick = function(){
                alert(i)
            }
       }
    }

箭頭函式

() => {}

  1. 如果只有一個引數,()可以省略
  2. 如果只有一個return {}可以省略
function(){
    
}

()=>{
    
}

栗子: 排序

let arr = [5,61,62,15,4,7]
// let newArr = arr.sort(function(n1,n2){
//     return n1 - n2
// })
let newArr = arr.sort((n1,n2) => {
    return n1 - n2
})
let newArr = arr.sort((n1,n2) => { n1 - n2 })

console.log(newArr);

省略括號

輸入a輸出

let name = a => a * 2
alert(asd(2))

函式的引數

  1. 引數擴充套件/展開
  2. 預設引數

    剩餘引數

引數擴充套件

  1. 收集剩餘引數
  • Rest Parameter(args)必須是最後一個
function show(a,b,...args){
    alert(a);
    alert(b);
    alert(args);
}
show(1,23,3,2,54,5)
// 1,23,[3,2,54,5]
  1. 擴充套件運算子

    只能將陣列展開,但是不能賦值

let aa = [1,2,3]
let bb = [23,32,43]
let arr = [...aa,...bb]
alert(arr)//1,2,3,23,32,43

預設引數

我希望我沒有傳的時候預設值

show = (a,b=12,c=23) => a + b + c
alert(show(1))

必傳引數

預設引數的一種應用

const required = () => { throw new Error('msg')}

const add = (a = required(), b = required()) => a + b;

alert(add(1,2))vv