JavaScript怎麼拿捏箭頭函數

2022-10-02 10:00:13
本篇文章給大家帶來了關於的相關知識,其中主要介紹了關於箭頭函數的相關問題,包括了語法規則、簡寫規則、常見應用等等內容,下面一起來看一下,希望對大家有幫助。

前端(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);
	} )
登入後複製

image.png

setTimeout(()=>{
	console.log("setTimeout");},3000)
登入後複製

簡寫規則

  • 如果箭頭函數只有一個函數,那麼()可以省略

name.forEach(item =>{console.log(item);}
登入後複製
  • filter()配合箭頭函數,可以高效的篩選出符合條件的數位。
var newNums = nus.filter(item =>{
  return item % 2;})
登入後複製
  • 如果函數體中只有一行執行程式碼,那麼{} 可以省略.

  • 並且這行程式碼的返回值會作為整個函數的返回值,所以不需要加 return
names.forEach(item => console.log(item));
登入後複製
  • filter()函數在只有一行執行,可以直接省略{}
varans = worker.filter( item=>item % 2 )
登入後複製
  • 如果預設返回值是一個物件,那麼這個物件必須加()

注意:在react 的 redux 經常使用。
我們會發現當箭頭函數 同時遇到 執行體的大括號和物件的大括號時,箭頭函數無法區分

var arrFn = () =>{} //此大括號是執行體
登入後複製
var arrFn = () =>{ name : "why"}// 此大括號是物件
登入後複製

所以為了區別執行器,必須要給物件加()

var arrFn = () =>({ name : "why"})
登入後複製

常見應用

map

map() 方法定義在JS的Array中,它返回一個新的陣列,陣列中的元素為原始陣列呼叫函數後處理的值。
值得注意的是:

  • map()函數不會對空陣列進行檢測。
  • map()函數不會改變原始陣列,它形成的是一個新陣列。
  • array.map(function(currentValue, index, arr), thisIndex)

引數說明:

  • function(currentValue,index,arr):必填
    • 陣列中的每個元素都會執行這個函數。
    • currentValue:必填,表示當前元素的值。
    • index:可選,當前元素的索引也就是第幾個陣列元素。
    • arr:可選,當前元素屬於的陣列物件。
  • thisValue:可選,物件作為該執行回撥時使用,傳遞給函數,用作「this」的值。

例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() 用於對陣列進行過濾。

  • 原理是它建立一個新陣列,新陣列的元素是通過檢查指定陣列中符合條件的所有元素。
  • filter把傳入的函數依次作用在每一個元素,然後根據返回值是true還是false決定保留還是丟棄元素。
  • Array.filter(function(currentValue, indedx, arr), thisValue)

引數說明:

  • function(currentValue,index,arr):必填
    • 陣列中的每個元素都會執行這個函數。
    • currentValue:必填,表示當前元素的值。
    • index:可選,當前元素的索引也就是第幾個陣列元素。
    • arr:可選,當前元素屬於的陣列物件。
  • thisValue:可選,物件作為該執行回撥時使用,傳遞給函數,用作「this」的值。
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:對原陣列的偶數進行平方後求累加和。

reduce

  • 用於遍歷陣列,可以設定初始值,大大增強了程式碼的可讀性,同時還有一個引數可以做累計計算。
  • array.reduce((pre, cur, index, arr),init)

引數說明:

  • function((pre, cur, index, arr)):必填
    • pre: 必填,積累值
    • cur: 必填。當前元素。
    • index: 可選。當前下標。
    • arr: 可選。當前陣列。
  • init: 可選。傳遞給函數的初始值,但傳入引數為兩個時,init 是累計值 pre的初始值。

如果reduce的引數只有一個,那麼累計值的初始值是陣列的第一個值。

如果reduce的引數有兩個,那麼積累值初始值就是設定好的 引數init初始值。

在每一次迭代中,返回的值都作為下一次迭代的 pre累計值。

var ans = arr.filter(item=>item%2).map(item=>item*item).reduce((x,y)=>x+y,0);
登入後複製

箭頭函數中的this使用

普通函數中是有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

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的識別符號,所以當箭頭函數內部開始呼叫this時。

JavaScript引擎就從作用域由裡到外的找含有this指向的作用域。

var obj ={
	name:"obj",
  foo:function(){
    var bar = ()=>{
      console.log("bar",this);
    }
    return bar;
  }}
登入後複製
  • 第一層 bar箭頭函數:沒有。
  • 第二層 function 函數:指向obj。

所以例子中的 this 指向obj。

var obj ={
	name:"obj",
  foo:()=>{
  	var bar =()=>{
      console.log("bar:",this);
    }
    return bar;
  }}
登入後複製
  • 第一層 bar箭頭函數:沒有。
  • 第二層 foo箭頭函數:沒有。
  • 第三層 全域性作用域:指向window。

所以例子中的 this 指向window。

模擬網路傳送請求

  • 封裝 request 工具函數
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其它相關文章!