單個引數,且函式執行體僅包含一條語句,返回值無需
return
關鍵字。
const foo = a => a + 1;
foo(1); // 2
單個引數,函式執行體含多條執行語句,需要使用塊級**段,即使用
{}括起來,不過此時若存在返回值,務必記得
return。
const foo = a =>
foo(1); // 3
多個引數需要
()括起來。
const test = (a, b) => a + b;
test(2, 3); // 5
多個引數,且函式中包含多條執行語句。
const foo = (a, b) =>
foo(2, 3); // 7
從以上**展示看,僅僅是語法糖在**編寫上的改進,其核心價值尚未體現。在
es5中,經過遇到上下文(
context
)混亂問題,看一下典型案例的分析。
var obj = , 0);
},b: function()
};obj.a();
// uncaught typeerror: this.b is not a function
報錯原因:理解js中
this
指向有個簡單的原則,即方法被哪個物件呼叫,方法內部的
this
就指向哪個物件。在上例中,
settimeout
宣告的執行體被
window
對用呼叫,而在
window
物件下沒有方法
b的宣告,因而報錯。
要驗證這個結論是否正確也很簡單,在
window
作用域下宣告方法
b,觀察執行結果即可。
window.b = function() ;
var obj = , 0);
},b: function()
};obj.a(); // window scope
// uncaught typeerror: this.b is not a function
每遇到這種情況,實現**設計者意圖,通常有兩種解決方式:
·
在settimeout
執行體內使用當前物件的引用,不要直接用
this關鍵
字 ·
利用call
、動態改變
this指向
第二種方式在此場景中並不必要,下面再細說,這裡使用第一種方式即可達成目標。
var obj = , 0);}};
在es6
中,可使用箭頭函式取代以上二種方案。
let obj = ,
b()
};obj.a(); // run b
call
、均可動態改變函式內
this
指向,區別是傳參方式不同。
var b = 'window作用域變數';
var obj = ,
b: 'obj物件屬性'
};obj.a(1, 2); // 1 2 *****> obj物件屬性
obj.a.call(window, 1, 2); // 1 2 *****> window作用域變數
//es5
function test(a)
console.log(a);
}test(); // 1
在es6
中有了更優雅的做法:
const test = (a = 1) =>
test(); // 1
test(2); // 2
// 對於物件型別的引數
const foo = ( = {}) =>
而對於複雜引數型別,比如引數值為物件,在保證引數預設值方面,
es6會讓你寫**的速度飛起來,並且讓**看起來不那麼髒,請比較以下**。
// es5
function test(cfg) ;
cfg.str = cfg.str || 'aaaa';
cfg.callback = cfg.callback || function() {};
// todo...
}// es6
const test = (} = {}) => ;
ES6箭頭函式總結
1.箭頭函式基本形式 let func num num let func num let sum num1,num2 num1 num2 1,2,3 map x x x 2.箭頭函式基本特點 1 箭頭函式this為父作用域的this,不是呼叫時的this let person person.init...
es6箭頭函式
本例是在了解es6知識後在原來定義函式的基礎上進行理解var searchvalue 查詢匹配物件 var button var input var select button if searchvalue.input undefined button.click else 重新整理 tableli...
es6 箭頭函式
1.單引數 function cheng a 3 let cheng a 3 a a console.log cheng 9 2.多引數 function add a,b let add a,b a b 預設返回值 console.log add 3,9 3.無返回值 function add a,...