主要解說:
1. rest參數
2. 嚴厲情勢
3. name屬性 -- 返回函數的函數名
4. 箭頭函數 -- 用 "=>" 定義函數
1.rest參數
...arguments <=> ...[...]
引入rest參數其目標是為了獵取函數的過剩參數 <=> 數組的擴大運算符...的逆向情勢
將參數數列轉為一個數組 <=> 將一個數組轉為逗號分開的參數序列
function push(arr,...items){ //有點安能辨我是雄雌的覺得
if(Array.isArray(items)){
array = array.concat(items); // rest參數的狀況
}else{
array.push(...items); // 數組的擴大運算的狀況
}
}
//rest參數
push([],1,23,4,45,56) //[1,23,4,45,56]
//數組的擴大運算
push([],...[1,23,4,45,56]); //[1,23,4,45,56]
注重:
1.rest參數必需位於函數參數末端,且只能存在一個rest參數,不然報錯
2.函數的length屬性不包括rest參數,就跟止步於默認值參數一樣,不確定的事變不斟酌在內
2.嚴厲情勢
es5中函數內部能夠設定嚴厲情勢,es6中函數參數運用了默認值、解構賦值、或許擴大運算符的話就不能設定嚴厲情勢
偽代碼:
function doSomething(...items){
'use strict';
...
}
//Uncaught SyntaxError: Illegal 'use strict' directive in function with non-simple parameter list
//因為代碼中基礎沒有在函數內部運用嚴厲情勢的狀況,這個就不多了解了
3.name屬性 — 返回函數的函數名
function push(arr,...items){}
push.name;
//"push"
push.bind({}).name
//"bound push"
let sayHi = function(){}
sayHi.name
//"sayHi"
let sayHi = function realName(){}
sayHi.name
//"realName"
let sayHell = new Function('x','y','console.log(x,y)');
sayHell.name
//"anonymous"
sayHell.bind({}).name
//"bound anonymous"
//僅僅曉得有這麼一個屬性,詳細用途未知
4.箭頭函數 — 用 “=>” 定義函數
let sayHi = name => name;
等價於:
let sayHi = function(name){
return name;
}
用法:
i.單個參數時,可直接寫參數名
ii.0個或兩個及兩個以上參數必需加括號
let f = () => 5;
let f = (x,y) => x+y;
iii.函數代碼塊多於一條語句,就要運用大括號括起來
let f = (x,y) => { ...}
**箭頭函數除了簡化函數的寫法,特別是匿名函數.另一個主要功用就是綁定定義時地點的作用域,而非運行時動態的作用域**
像click,setTimeout,setInterval這類運行時動態轉變作用域的,寫成箭頭函數的情勢則this依然為代碼定義處的this
//計時器一個
function Timer(){
this.count = 0;
setInterval(() => {this.count++;},1000);
}
let t = new Timer();
等價的寫法:
function Timer(){
this.count = 0;
let __that = this;
setInterval(function(){__that.count++;},1000);
}
//嵌套的狀況,能夠以此類推.實在就是在外層作用域建立一個變量指向this,然後內層運用.每一層都邑建立該層的this指向供下一層運用.
若有bug請斧正Thanks♪(・ω・)ノ!