一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - JavaScript中你不知道的函數(shù)

JavaScript中你不知道的函數(shù)

2020-11-06 23:46掘金前端橘子君 Java教程

在JavaScript中,對(duì)于函數(shù)的聲明有兩種表達(dá)形式, 聲明式 和 表達(dá)式 ,至于其他函數(shù)(如立即執(zhí)行函數(shù),箭頭函數(shù)等)都是基于這兩種形式衍生的。

JavaScript中你不知道的函數(shù)

函數(shù)聲明

JavaScript中,對(duì)于函數(shù)的聲明有兩種表達(dá)形式, 聲明式 和 表達(dá)式 ,至于其他函數(shù)(如立即執(zhí)行函數(shù),箭頭函數(shù)等)都是基于這兩種形式衍生的。

// 聲明式 

function foo () { 

  console.log('我是聲明式'

 

// 表達(dá)式 

var foo = function () { 

  console.log('我是表達(dá)式'

具名函數(shù)

故名思意,具名函數(shù)就是有名稱的函數(shù),這是我們最常見的一種函數(shù),我們先來(lái)看看它的寫法。

// 具名函數(shù) 

function foo () { 

  console.log('我是具名函數(shù)'

上邊說(shuō)了,函數(shù)聲明的表達(dá)形式有兩種,具名函數(shù)是經(jīng)典的聲明式,具名函數(shù)表達(dá)式的另外一種表現(xiàn)形式引出了另外一種函數(shù)類型- 具名函數(shù)表達(dá)式(NFE) 。

具名函數(shù)表達(dá)式

具名函數(shù)表達(dá)式就是具名函數(shù)的表達(dá)式寫法,嚴(yán)格來(lái)說(shuō),它并不是一種函數(shù)類型,只是一種寫法而已。

// 具名函數(shù)表達(dá)式 

var fn = function foo () { 

  console.log('我是具名函數(shù)表達(dá)式'); 

fn() // 輸出:我是具名函數(shù)表達(dá)式 

它有幾個(gè)特點(diǎn):

  • 函數(shù)名標(biāo)識(shí)符私有化
  • 函數(shù)名標(biāo)識(shí)符常量化

函數(shù)名標(biāo)識(shí)符私有化:即具名函數(shù)表達(dá)式的函數(shù)名不能從外部調(diào)用,僅供函數(shù)體內(nèi)部使用,當(dāng)外部調(diào)用時(shí)就會(huì)報(bào)錯(cuò)。

// 函數(shù)名稱私有化 

var fn = function foo () { 

  console.log(typeof foo); 

fn() // function 

foo() // Uncaught ReferenceError: foo is not defined 

函數(shù)名標(biāo)識(shí)符常量化:即具名函數(shù)表達(dá)式標(biāo)識(shí)符的值不能修改,我們可以將其當(dāng)作常量來(lái)使用。

var fn = function foo(){ 

    foo = 12; 

    console.log(foo); 

 

fn() 

/* 

輸出: 

ƒ foo(){ 

    foo = 12; 

    console.log(foo); 

*/ 

我們來(lái)看一道經(jīng)典的面試題

// 改寫以下代碼,使其分別輸出10、12 

var foo = 10; 

(function foo   (){ 

    foo = 12; 

    console.log(foo); 

})() 

 

// 改寫結(jié)果 

var foo = 10; 

(function foo   (){ 

    var foo = 12; 

  console.log(window.foo); // 10 

  console.log(foo); // 12 

})() 

匿名函數(shù)

匿名函數(shù):即沒有名稱的函數(shù),匿名函數(shù)不能像具名函數(shù)一樣直接聲明定義,在JavaScript中常見的用法就是將匿名函數(shù)當(dāng)作回調(diào)參數(shù)使用或作為高階函數(shù)的返回值。

// 作為回調(diào)參數(shù) 

setTimeout(function () { 

  console.log('我是匿名函數(shù)'); 

}, 1000); 

 

// 作為高階函數(shù)的返回值 

function foo () { 

  var num = 10; 

  return function (i) { 

    return num + i; 

  } 

 

foo()(5) // 輸出:15 

匿名函數(shù)有幾個(gè)缺點(diǎn)我們需要注意一下:

  • 沒有函數(shù)名,調(diào)試?yán)щy
  • 如需引用自身(如遞歸函數(shù)),需要用 arguments.callee ,但是 arguments.callee 在嚴(yán)格模式下禁用
  • 可讀性差

立即執(zhí)行函數(shù)

立即執(zhí)行函數(shù)(IIFE):即當(dāng)程序解析到該函數(shù)時(shí)就立即執(zhí)行。

// 寫法一 

(function () { 

  console.log('我是立即執(zhí)行函數(shù)'); 

})() 

 

// 寫法二 

(function () { 

  console.log('我是立即執(zhí)行函數(shù)'); 

}()) 

匿名函數(shù)的優(yōu)點(diǎn)在于內(nèi)部參數(shù)不會(huì)泄露,即變量私有化。

(function () { 

  var x = 10 

  console.log('我是立即執(zhí)行函數(shù)'); 

}()) 

 

console.log(x); // Uncaught ReferenceError: x is not defined 

有一道很經(jīng)典的面試題,我們可以看一下。

// 改寫以下代碼,讓其依次輸出. 

for (var i = 0; i < 5; i++) { 

    setTimeout(function () { 

        console.log(`值為${i}`) 

    }, 0) 

// 此時(shí)會(huì)輸出5次 "值為5" 

我們會(huì)立馬想到用 let ,但是還有沒有其他寫法呢?當(dāng)然有,立即執(zhí)行函數(shù)就是了。

// 改寫方法一 

for (var i = 0; i < 5; i++) { 

  (function(num){ 

    console.log(`值為${num}`) 

  })(i) 

 

// 改寫方法二 

for (var i = 0; i < 5; i++) { 

  var num = (function(){ 

    return i; 

  })() 

  console.log(`值為${num}`) 

原文地址:https://juejin.im/post/6891565170167021576?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久久久久久吹潮 | 亚洲国产精品ⅴa在线观看 亚洲国产高清一区二区三区 | 美女隐私部位视频网站 | 温柔校草高h| 国产爱啪啪 | 久久久免费热线精品频 | 亚洲精品乱码久久久久久蜜桃图片 | 美女黄板视频 | 黑人艹逼 | 亚洲欧美精品一区天堂久久 | 久久免费看少妇级毛片蜜臀 | 亚洲午夜精品久久久久久人妖 | 国内老司机精品视频在线播出 | 精品免费视在线视频观看 | 国产麻豆精品视频 | 亚洲人成伊人成综合网久久 | 99视频有精品视频免费观看 | 亚洲国产美女精品久久 | 亚洲午夜久久久久影院 | 天码毛片一区二区三区入口 | 日本天堂影院在线播放 | 痴mu动漫成年动漫在线观看 | 国产高清在线精品一区二区三区 | 欧美视频一区二区三区四区 | 外国老少性配 | 国产极品精频在线观看 | 91麻豆精品 | 国产精品2| 91视频破解版 | 护士让我吃奶我扒她奶 | 九九成人免费视频 | 九九99九九精彩网站 | 暗卫调教女主肉高h | 香蕉国产人午夜视频在线 | 激情六月丁香婷婷四房播 | 色综色天天综合网 | 成人精品在线 | 脱女学小内内摸出水网站免费 | 欧美日韩亚洲综合在线一区二区 | 韩国丽卡三级作品 | 欧美日韩国产最新一区二区 |