箭头函式
Node.js 箭头函式
Categories:
原始函式与箭头函式比较
原始函式
function greeting() {
console.log('Hello, JavaScript!!');
}
greeting();
箭头函式
const greeting = () => {
console.log('Hello, JavaScript!!');
};
greeting();
函式仅回传指定资料
函式本身只是要回传某个值的话,可以把 return
这个字省略掉,要回传的资料直接放在箭头
后方
const greeting = () => console.log('Hello, JavaScript!!');
greeting();
const greeting = () => 'Hello, JavaScript!!';
console.log(greeting()); // 'Hello, JavaScript!!'
// 等同于这样写
const greeting = function () {
return 'Hello, JavaScript!!';
};
箭头函式带入参数值
const add = (a, b) => a + b;
console.log(add(3, 5));
// 等同于这样写
const add = function (a, b) {
return a + b;
};
箭头函式对 this 的影响
箭头函式当中的 this
绑定的是是定义时的物件,而不是使用时的物件,所以定义当下 this
指的是哪个物件就会是那个物件,不会随着时间改变
let id = 21;
let data = {
id: 21,
};
fn.call(data);
arrowFn.call(data);
// 原本的 function
function fn() {
// [fn] Object
console.log(`[fn] ${this.constructor.name}`);
setTimeout(function () {
// [fn.setTimeout] Timeout
console.log(`[fn.setTimeout] ${this.constructor.name}`);
}, 100);
}
// 箭头函式 Arrow function
function arrowFn() {
// [arrowFn] Object
console.log(`[arrowFn] ${this.constructor.name}`);
setTimeout(() => {
// [arrowFn.setTimeout] Object
console.log(`[arrowFn.setTimeout] ${this.constructor.name}`);
}, 100);
}
this.constructor.name
:这样子的写法只是避免在回传出物件的时候,把整个物件内容给传出来,而是仅传出该物件的名称。
使用 .call(data)
指定在函式都是使用 data
这个物件当作是 this
物件
fn.call(data) 传统函式
裡面的 setTimeout 执行的时间点是在 Stack
没有任务时,才从 task queue
拿出来执行,当时的执行环境是 global environment
,所以 this
的绑定会依据当时执行的环境换掉
arrowFn.call(data) 箭头函式
裡面的 setTimeout 是在 data
物件当成是 this
时候定义的,所以箭头函式内的 this
会一直绑定为原呼叫的物件