91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript 中匿名函數有什么用

發布時間:2021-07-01 15:17:46 來源:億速云 閱讀:198 作者:Leah 欄目:大數據

這篇文章將為大家詳細講解有關JavaScript 中匿名函數有什么用,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

本文源自知乎的一個提問:

JavaScript 中匿名函數有什么用  

同樣都是在運行時才能確定函數,為什么    b   是匿名函數?


這個看似簡單的問題,我在瀏覽器里搗鼓了一個多小時。而且好像發現了 FireFox/Chrome Devtools 的 2 個疑似 bug。
在 ES 規范中,有一個內部函數    IsAnonymousFunctionDefinition()   用來判斷一個函數是否為匿名函數,但是這個函數只在規范中使用,通過 JS 代碼并不能調用,很多 JS 引擎會在內部實現這個函數(非強制要求)。
當我們談到匿名函數時,其實有 2 種不同的含義:
  1. 函數沒有名字
  2. 函數的  name  屬性是 "anonymous"
由于函數的    name  是繼承自    Function.prototype.name  ,因此沒有名字的函數的    name  屬性是空字符    ""  。
在大部分調試工具中,沒有名字的函數會顯示為    <anonymous>  ,也就是我們經常說的匿名函數。
我們把題目中的代碼改寫一下:
  
    
  
  
  var a = () => () => { throw new Error('foo') }
不論是    a()()  ,還是    var b = a(); b()  ,在 Chrome 中執行:

JavaScript 中匿名函數有什么用

可以清楚的看到,這個函數是匿名函數。(忽略最下面的匿名函數,那個是    Global Scope  )
在 FireFox 的的調用棧都是:

JavaScript 中匿名函數有什么用

 這就太迷了。不論如何調用    b   函數,    a   都不應該出現在調用棧中,我覺得這應該可以算是 FireFox 的一個 bug 了。
如果使用    new Function   定義函數,錯誤棧里是沒有尖括號的。因為根據規范,使用    Function   定義的函數是有名字的,名字就是    "anonymous"  。就好比一個人叫無名氏,并不是因為他沒有名字,而是他姓無,叫名氏。
在對于這個的處理上,Firefox 略勝一籌吧:
  
    
  
  
  var a = new Function('throw new Error("bar")')a()
FireFox 截圖:

JavaScript 中匿名函數有什么用

 我們再看一下 Chrome Devtools:

JavaScript 中匿名函數有什么用

 有點迷惑,可能是把引擎內部的調用棧 dump 出來了吧。我覺得這個也可以被認為是一個 bug 了。
題主的疑惑是,為什么    var a = () => () => 1   的函數名是    a  ,而    var b = a()   就是匿名函數。
簡單解釋就是,    var a = () => 1   包含了 2 個階段,箭頭函數定義和賦值操作。所有的箭頭函數都是匿名函數,在箭頭函數的定義中,規范內部的    hasName   屬性直接設置為了    false  。然后    IsAnonymousFunctionDefinition(expr)   判定此函數是匿名函數:
  • If  IsFunctionDefinition  of  expr  is  false , return  false .
  • Let hasName be HasName of expr.
  • If hasName is true , return false .
  • Return  true .
當賦值時,會先判斷右值是否為匿名函數。如果是的話,重新設置函數名。
我們再來看看另一個語句:  var b = a()  。這個也包含了賦值操作,還有一個函數調用操作。
只有匿名函數(靜態語義)執行賦值操作時,才會為變量( rval  )重新設置 name   屬性,即函數名。這里的a()   只是一個函數調用,并不是函數定義, 所以不會重新設置函數名。
類似的:
  
    
  
  
  var a = (1, () => 'foo')a = [() => 1][0]var a = eval('()=>1')

關于JavaScript 中匿名函數有什么用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

朔州市| 莒南县| 仙桃市| 洛川县| 广平县| 南汇区| 隆德县| 辰溪县| 峨山| 桑植县| 读书| 民权县| 宜君县| 马鞍山市| 达日县| 六枝特区| 怀柔区| 林西县| 渝北区| 焉耆| 旌德县| 莱阳市| 博爱县| 鹰潭市| 义乌市| 延吉市| 高安市| 土默特右旗| 湘西| 四川省| 抚州市| 环江| 涟源市| 北宁市| 阿图什市| 忻城县| 涞水县| 达孜县| 黑水县| 青浦区| 清流县|