前端(vue)入門到精通課程:進入學習
API 檔案、設計、偵錯、自動化測試一體化共同作業工具:
【相關推薦:、】
在ES6中新增了函數的簡寫方式----箭頭函數,箭頭函數的出現不僅簡化了大量程式碼,也讓程式碼看起來更加優雅,同時也解決了this指向問題,下面我們就來詳細講解如何玩轉箭頭函數。
之前的方法
function foo1(){}var foo2 = function(name,age){
console.log("函數體程式碼",this,arguments);
console.log(name,age);}
登入後複製
箭頭函數完整寫法
var foo3 = (name,age) => {
console.log("箭頭函數的函數體")
console.log(name,age);}
登入後複製
箭頭函數遍歷陣列
var names = ["abc","cba","nba"];names.forEach(function(item)){
console.log(item);})
登入後複製
names.forEach((item,idx,arr)=>{
console.log(item,idx,arr);
} )
登入後複製
setTimeout(()=>{
console.log("setTimeout");},3000)
登入後複製
如果箭頭函數只有一個函數,那麼()可以省略
name.forEach(item =>{console.log(item);}
登入後複製
var newNums = nus.filter(item =>{
return item % 2;})
登入後複製
如果函數體中只有一行執行程式碼,那麼{} 可以省略.
names.forEach(item => console.log(item));
登入後複製
varans = worker.filter( item=>item % 2 )
登入後複製
如果預設返回值是一個物件,那麼這個物件必須加()
注意:在react 的 redux 經常使用。
我們會發現當箭頭函數 同時遇到 執行體的大括號和物件的大括號時,箭頭函數無法區分
var arrFn = () =>{} //此大括號是執行體
登入後複製
var arrFn = () =>{ name : "why"}// 此大括號是物件
登入後複製
所以為了區別執行器,必須要給物件加()
var arrFn = () =>({ name : "why"})
登入後複製
map() 方法定義在JS的Array中,它返回一個新的陣列,陣列中的元素為原始陣列呼叫函數後處理的值。
值得注意的是:
array.map(function(currentValue, index, arr), thisIndex)
引數說明:
例1:對原陣列進行平方後賦值給新陣列。
let arry = [1,2,3,4];let newArray = array.map((item)=>{
return item*item;})
登入後複製
也可以化簡成下面一行程式碼。
let newArray = array.map(item =>item * item)
登入後複製
例2:對原陣列的偶數進行平方後賦值給新陣列。
filter() 用於對陣列進行過濾。
filter
把傳入的函數依次作用在每一個元素,然後根據返回值是true
還是false
決定保留還是丟棄元素。Array.filter(function(currentValue, indedx, arr), thisValue)
引數說明:
let newArray = array.filter(item=>item%2===0).map(item =>item * item)
登入後複製
例3:對原陣列中的偶數下標進行平方後賦值給新陣列。
let array = [1, 2, 3, 4];
let newArray = array.filter((item,idx)=>idx%2===0).map(item =>item * item)
登入後複製
例4:巧妙利用 arr 引數,給陣列去重.
var newArray = array.filter((item,idx,arr)=>arr.indexOf(item) === idx)
登入後複製
例2:對原陣列的偶數進行平方後求累加和。
array.reduce((pre, cur, index, arr),init)
引數說明:
如果reduce
的引數只有一個,那麼累計值的初始值是陣列的第一個值。
如果reduce
的引數有兩個,那麼積累值初始值就是設定好的 引數init
初始值。
在每一次迭代中,返回的值都作為下一次迭代的 pre
累計值。
var ans = arr.filter(item=>item%2).map(item=>item*item).reduce((x,y)=>x+y,0);
登入後複製
普通函數中是有this的識別符號
function foo(){
console.log("foo",this);}foo()//windowfoo.apply("aaa")//aaa
登入後複製
箭頭函數中,壓根沒有this。
var bar = ()=>{console.log("bar",this)}bar()//windowbar.apply("AAA")//window
登入後複製
concat()方法是用於連線兩個或多個陣列。
var arr = [1, 2, 3, 4];
var arr2 = [7, 8, 9, 10];
var ans = [].concat(arr,arr2);
console.log(ans);//輸出:(8) [1, 2, 3, 4, 7, 8, 9, 10]
登入後複製
因為箭頭函數中沒有this的識別符號,所以當箭頭函數內部開始呼叫this時。
JavaScript引擎就從作用域由裡到外的找含有this指向的作用域。
var obj ={
name:"obj",
foo:function(){
var bar = ()=>{
console.log("bar",this);
}
return bar;
}}
登入後複製
所以例子中的 this 指向obj。
var obj ={
name:"obj",
foo:()=>{
var bar =()=>{
console.log("bar:",this);
}
return bar;
}}
登入後複製
所以例子中的 this 指向window。
模擬網路傳送請求
function request(url,callback){
var res = ["abc","cba","nba"];
callback(res);}
登入後複製
因為此時傳入 request 的function ,就是 request 定義中的 callback()。
所以 function 中的引數就是 request 定義中的 res 陣列,然後賦值給了 此物件中names
但因為 function 是個回撥函數的this 的指向是 window,所以需要在外層的函數中,規定一個_this指向當前物件。
var _this = this;
登入後複製
然後 將獲取過來的 res 陣列 賦值給 _this 中的names
_this.name = [].concat(ans);
登入後複製
var obj = {
names:[],
network:function(){
var _this = this;
request("/names",function(ans){
_this.name = [].concat(ans);
})}
登入後複製
因為箭頭函數本身是沒有 this的,js引擎會由內往外的找 this的指向。
發現 外層的 函數 this指向obj,於是 this 就指向了 obj。
var obj = {
names:[],
network:function(){
request("/names",(ans)=>{
this.name = [].concat(ans);
})}
登入後複製
【相關推薦:、】
以上就是JavaScript怎麼拿捏箭頭函數的詳細內容,更多請關注TW511.COM其它相關文章!