方法:
function
省略並在參數後面加上=>
。{}
及return
去掉並改成。()
都可以省略。 const family = function (params) {return console.log('函式的參數: ' + params)}
family(10); //函式的參數: 10
const family03 = (params) => {return console.log('函式的參數: ' + params)}
family03(30); //函式的參數: 30
const family02 = (params) => console.log('函式的參數: ' + params);
family02(20); //函式的參數: 20
PS1:如果依照上述第2點規則,且回傳的值是物件實字,則會出現undefined,需要用({})
包裹。
const fn = function () {
return {
data: 1,
name: 'TOM',
};
};
console.log(fn()); //{data: 1, name: 'TOM'}
const arrowfn = () => {};
console.log(arrowfn()); //undefined
const arrowfn01 = () => ({});
console.log(arrowfn01()); //{}
**PS2:**如果依照上述第2點規則,箭頭函式搭配判斷子,則會報錯,依樣需要用()
包裹。
let number = 0;
const numberFn = number || function (param) { console.log(param) };
numberFn(100); //100
let number01 = 0;
const numberFn01 = number01 || ((param) => { console.log(param) });
numberFn01(200); //200
1.缺乏內建arguments:傳統函式會內建argument
,可以把傳入函式的參數,全部以類似陣列的形式呈現出來;但是箭頭函式無法,必須在參數內輸入...變數
(稱為其餘參數),才可以。
2.this
3.箭頭函式無法當作建構函式
const family = function () {
return console.log(arguments)
}
family(10, 20, 30); //Arguments(3) [10, 20, 30, callee: ƒ, Symbol(Symbol.iterator): ƒ]
const family = () => {
return console.log(arguments)
}
family(10, 20, 30); //Uncaught ReferenceError: arguments is not defined
const family = (...varible) => {
return console.log(varible)
}
family(10, 20, 30); //(3) [10, 20, 30]
1.沒有arguments
2.this:
傳統函式的this:與this如何被呼叫有關。
箭頭函式的this:依據所屬的函式在哪裡建立而決定。call、apply、bind
失效:無法指定this的指向。
3.箭頭函式無法當作建構函式
const fn = function () { // 傳統 function 的寫法
console.log(this);
};
fn(); // Window Object
const arrowFn = () => { //arrow Function在全域中建立
console.log(this);
};
arrowFn(); // Window Object,arrowFn(),故指向window。
var name = '全域阿婆'
var auntie = {
name: '漂亮阿姨',
callName: function () { //傳統function
console.log('1', this.name); // 1 漂亮阿姨
setTimeout(() => {
console.log('2', this.name); // 2 漂亮阿姨
console.log('3', this); // 3 auntie 這個物件
}, 10);
},
callName2: () => { //arrow function:屬於全域變數auntie的物件裡面
console.log('4', this.name); // 4 全域阿婆
setTimeout(() => {
console.log('5', this.name); // 5 全域阿婆
console.log('6', this); // 6 window 物件
}, 10);
}
}
var func = function () {
var func2 = function () {
setTimeout(() => {
console.log(this);
}, 10);
};
var func3 = {
func: func2,
var4: 4
}
func2(); // this = window
func3.func(); // func3 Object,因為此時的箭頭函式屬於物件內屬性的值。
}
func();
1.沒有arguments
2.this
3.箭頭函式無法當作建構函式:無法利用箭頭函式來自訂原型。
const fn = function (name) {
this.name = name;
};
console.log(fn.prototype); //{constructor: ƒ}
const TOM = new fn('TOM');
console.log(TOM); //fn {name: 'TOM'}
const arrowfn = (name) => {
this.name = name;
}
console.log(arrowfn.prototype); //undefined
const BOB = new arrowfn('BOB');
console.log(BOB); //Uncaught TypeError: arrowfn is not a constructor
const array = [11, 22, 33, 44, 55, 66, 77];
const array02 = array.map(function (params) { return params * 2 });
console.log(array02); //(7) [22, 44, 66, 88, 110, 132, 154]
const array03 = array.map((params) => params * 2);
console.log(array03); //(7) [22, 44, 66, 88, 110, 132, 154]
補充:目標陣列.map
為提取目標陣列內的內容,每筆都做編輯。
先備知識:
Array.from
:提取輸入的參數並形成新的陣列.reduce
:會對每一個目前迭代到的陣列元素(除了空值以外)執行 callback 函式,函式內有四個參數(accumulator
、currentValue
、currentIndex(非必要)
、array(非必要)
),因為是抓取陣列的前一個值跟後面一個值做操作,所以會有個一個initialValue
來跟Array[0]
搭配。第一次
被呼叫時,accumulator 與 currentValue 的值可能為兩種不同的狀況:若在呼叫 reduce()
時有提供 initialValue
,則 accumulator 將會等於 initialValue,且 currentValue 會等於陣列中的第一個元素值;若沒有提供 initialValue
,則 accumulator 會等於陣列的第一個元素值,且 currentValue 將會等於陣列的第二個元素值。 const average = function () {
const nums = Array.from(arguments);
const total = nums.reduce(function (acc, val) {
return acc + val
}, 0);
return total / nums.length;
}
console.log(average(1, 2, 3, 4, 5)) // 15(參數和)/5(參數數量)得3
const average02 = (...nums) =>nums.reduce((acc, val) =>acc + val, 0) / nums.length
console.log(average02(1, 2, 3, 4, 5)) //3
參考文章: