基礎用法
在ES6中許可運用 => 來定義函數,以下:
var f = a => a;
console.log(f(1)); //1
就等同於
var f = function(a){
return a;
}
console.log(f(1)); //1
從上面能夠看出,在箭頭左邊的是代表參數,若參數只要一個,()能夠省略,箭頭右邊的示意函數代碼塊,若代碼塊內里是個返回值,則{}能夠省略不寫
1.無參數狀況
若箭頭函數不需要參數,則左邊用()替代,以下:
var f = () => {
console.log("無參數狀況");
}
f();//無參數狀況
2.有參數狀況
var f = (a, b) => {
return a+b;
}
console.log(f(1,2)); //3
var f = a => a;
console.log(f(1)); //1
假如箭頭函數有參數,則需要用()括起來,若只要一個參數,括號能夠省略不寫
在這裏要注重一個狀況,就是當箭頭函數直接返回一個對象的時刻,以下:
var f = () => {name:'liming', age:22}; //報錯
console.log(f());
如許寫肯定是報錯的,由於{}實行時變成代碼塊,會去運轉代碼,所以要用一個()括起來才能夠,以下:
var f = () => ({name:'liming', age:22});
console.log(f());
實行效果為:
{name: "liming", age: 22}
以上這個寫法才是準確的
箭頭函數注重點
1.this指向
var a = '全局變量a';
var obj={
a:'部分變量a',
fn1:function(){
console.log(this.a);
},
fn2:()=>{
console.log(this.a);
}
}
obj.fn1();
obj.fn2();
輸出效果為:
部分變量a
全局變量a
一般函數的this我們曉得是指向近來的一個對象,而箭頭函數的this實際上是指向定義時的this,比方把上面代碼改成:
var obj={
a:'部分變量a',
fn1:function(){
console.log(this.a);
},
fn2:()=>{
console.log(this.a);
}
}
obj.fn1();
obj.fn2();
輸出效果為:
部分變量a
undefined
此時由於箭頭函數是指向全局的,全局沒有變量a則輸出undefined,這裏的fn1和fn2都是全局函數,所以箭頭函數this指向的是定義時的全局,而一般函數的this指向的是近來的一個對象
上面假如誰人例子不太邃曉,能夠再看下以下例子:
this.a = '全局a';
function Timer() {
this.a = 'timer中的a';
// 一般函數
setTimeout(function () {
console.log('一般函數:', this.a);
});
// 箭頭函數
setTimeout(() => {
console.log('箭頭函數:',this.a);
});
}
new Timer();
輸出效果為:
一般函數: 全局a
箭頭函數: timer中的a
這裏一般函數會指向全局是由於,間隔一般函數近來的對象是setTimeOut,而setTimeOut是掛在全局作用域中,所以一般函數指向全局,箭頭函數指向的是定義時的對象,箭頭函數是在Timer中定義的,所以箭頭函數指向Timer
假如把以上代碼改成以下:
this.a = '全局a';
function Timer() {
this.a = 'timer中的a';
// 一般函數
setTimeout(function () {
console.log('一般函數:', this.a);
});
// 箭頭函數
setTimeout(() => {
console.log('箭頭函數:',this.a);
});
}
Timer();
輸出效果:
一般函數: timer中的a
箭頭函數: timer中的a
這個是為何呢,由於假如是new Timer相稱因而組織函數,組織了一個對象,假如是Timer()就相稱因而挪用函數Timer()這兩者照樣有區分的,假如是挪用函數Timer(),這個時刻this的指向都是全局,在部分修正this.a會掩蓋全局的this.a
經由過程以上,我們能夠曉得一般函數跟箭頭函數this指向的區分是:
一般函數: this指向最靠近的一個對象
箭頭函數: this指向定義時的對象,也就是說箭頭函數一旦定義完成,它的指向是牢固的,沒法轉變,它的指向是定義時地點的作用域,而不是實行時的作用域
2.不能夠當作組織函數
箭頭函數不能夠當作組織函數,也就是不能夠new一個,不然會報錯,以下:
var fn = ()=>{
console.log("123");
}
new fn(); //Uncaught TypeError: fn is not a constructor
以上會報錯,由於箭頭函數自身沒有屬於本身的this,所以箭頭函數不能夠當作組織函數,也由於箭頭函數沒有本身的this,所以call()、apply()、bind()這些要領去轉變this的指向對箭頭函數也是無效的,以下:
this.x = 'outer';
(function() {
console.log([
(() => this.x).bind({ x: 'inner' })()
]);
})();
輸出效果為:
["outer"]
把箭頭函數經由過程bind綁定可見無效,箭頭函數照樣指向全局
以上是個人總結,有什麼不足之處迎接留言討論!