最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析JavaScript中的特殊函數(shù)及用法小結(jié)

 更新時間:2022年06月29日 10:57:05   作者:一碗周  
JavaScript中的函數(shù)本質(zhì)上是一個對象,我們可以將這個對象賦值給一個變量,這就使JavaScript中的函數(shù)變得非常的靈活,現(xiàn)在就來淺看一下JavaScript中函數(shù)的一些用法,需要的朋友可以參考下

寫在前面

JavaScript中的函數(shù)本質(zhì)上是一個對象,我們可以將這個對象賦值給一個變量,這就使JavaScript中的函數(shù)變得非常的靈活,現(xiàn)在就來淺看一下JavaScript中函數(shù)的一些用法。

 匿名函數(shù)

JavaScript 可以將函數(shù)作為數(shù)據(jù)使用。作為函數(shù)本體,它與普通的數(shù)據(jù)一樣,不一定有名字。沒有名字的函數(shù)被稱之為匿名函數(shù)。

示例代碼如下:

//匿名函數(shù)
 function(){               //匿名函數(shù),會報錯
     return '一碗周'; 
}

但是在 JavaScript 并不支持匿名函數(shù)的語法,不過匿名函數(shù)有兩個應(yīng)用,如下所示:

  • 回調(diào)函數(shù):將一個函數(shù)作為另一個函數(shù)的參數(shù)使用,作為參數(shù)的函數(shù)

  • 自調(diào)函數(shù):函數(shù)調(diào)用自身(定義即調(diào)用的函數(shù))

回調(diào)函數(shù)

然函數(shù)與任何可以被賦值給變量的數(shù)據(jù)是相同的,那么它當(dāng)然可以像其他數(shù)據(jù)那樣被定義、刪除、拷貝,以及當(dāng)成參數(shù)傳遞給其他函數(shù)。

當(dāng)一個函數(shù)作為參數(shù)傳遞給另一個函數(shù)時,作為參數(shù)的函數(shù)被稱之為回調(diào)函數(shù)。作為使用回調(diào)函數(shù)的函數(shù)稱為目標(biāo)函數(shù)(外層函數(shù))

示例代碼如下所示

// 定義一個函數(shù),這個函數(shù)有兩個函數(shù)類型的參數(shù),然后分別執(zhí)行那兩個函數(shù),并返回它們的和。
function sum(a, b) { // -> 目標(biāo)函數(shù)
  return a() + b()
}
function one() { // -> 回調(diào)函數(shù)
  return 1;
}
function two() { // -> 回調(diào)函數(shù)
  return 2;
}
console.log(sum(one, two)); // 3

執(zhí)行流程如下:

當(dāng)執(zhí)行 sum 函數(shù)時,傳入兩個實參,在 sum 函數(shù)中,會將兩個實參作為函數(shù)執(zhí)行,并將返回值計算并返回。

匿名回調(diào)函數(shù)

所謂匿名回調(diào)函數(shù),就是目標(biāo)函數(shù)中的參數(shù)是沒有名稱的函數(shù),將上一段代碼修改為使用匿名回調(diào)函數(shù)

// 定義一個函數(shù),這個函數(shù)有兩個函數(shù)類型的參數(shù),然后分別執(zhí)行那兩個函數(shù),并返回它們的和。
function sum(a, b) { // -> 目標(biāo)函數(shù)
  return a() + b()
}
console.log(sum(
  function () { // -> 匿名回調(diào)函數(shù)
    return 1
  },
  function () { // -> 匿名回調(diào)函數(shù)
    return 2
  })); // 3

帶參數(shù)的回調(diào)函數(shù)

function multiplyByTwo(a, b, c, callbakc) {
  var i, ar = []
  for (i = 0; i < 3; i++) {
    // 通過 arguments 對象將傳入的參數(shù) * 2,然后傳入回調(diào)函數(shù)進行操作
    ar[i] = callbakc(arguments[i] * 2);
  }
  return ar;
}
console.log(multiplyByTwo(1, 2, 3,
  function (a) { // 匿名回調(diào)函數(shù)
    return a + 2
  }));

回調(diào)函數(shù)的優(yōu)點:

  • 匿名回調(diào)函數(shù)節(jié)省了全局命名空間

  • 將私有的數(shù)據(jù)內(nèi)容開放給指定位置使用

  • 保證封裝性 - 雖然可以使用私有數(shù)據(jù),但是并不知道來源

  • 有助于提升性能

但是回調(diào)函數(shù)也是有缺點的,當(dāng)目標(biāo)函數(shù)的參數(shù)是一個回調(diào)函數(shù)時,回調(diào)函數(shù)的參數(shù)又是另一個回調(diào)函數(shù),另一個回調(diào)函數(shù)的參數(shù)還是一個回調(diào)函數(shù)…也就是套娃,也就形成了回調(diào)陷阱或稱回調(diào)地獄。

自調(diào)函數(shù)

目前我們已經(jīng)討論了匿名函數(shù)在回調(diào)方面的應(yīng)用。接下來我們討論另外一種情況,即自調(diào)函數(shù),這種函數(shù)可以在定義后立即調(diào)用。示例代碼如下所示

(
  function () {
    console.log("自調(diào)函數(shù)");
  }
)()

這種語法看上去有點唬人,其實沒有什么,我們只需將匿名函數(shù)的定義放進一對括號中,然后外面再緊跟一對括號即可。

語法結(jié)構(gòu)如下圖所示

值得注意的是,自調(diào)函數(shù)可以命名,但是還是會自調(diào)用,如果用函數(shù)名調(diào)用的話會拋出異常。

自調(diào)函數(shù)除了以上兩種方式外,還有以下幾種不常用的方式

+ function (v) { // 形參
  var w = 100; // 局部變量
  console.log("自調(diào)函數(shù)" + v);
}(1);// 實參

! function (v) {
  var w = 100; // 局部變量
  console.log("自調(diào)函數(shù)" + v);
}(2);

~ function (v) {
  var w = 100; // 局部變量
  console.log("自調(diào)函數(shù)" + v);
}(3);

使用即時自調(diào)匿名函數(shù)的好處是不會產(chǎn)生任何全局變量。

缺點在于這樣的函數(shù)是無法重復(fù)執(zhí)行的(除非將它放在某個循環(huán)或其他函數(shù)中)。這也使得即時函數(shù)非常適合于執(zhí)行一些一次性的或初始化的任務(wù)。

作為值的函數(shù)

將一個函數(shù)作為另一個函數(shù)的結(jié)果并返回,作為結(jié)果返回的函數(shù)稱之為作為值的函數(shù)。

示例代碼如下:

function outer() {
  var v = 100;
  // 在函數(shù)的函數(shù)體中定義另一個函數(shù) -> 內(nèi)部(私有)函數(shù)
  return function () { // 使用匿名函數(shù)
    return v * 2
  }
}
var result = outer();
console.log(result); // [Function]
// 或者下面這種方式與上面那種方式相同
function outer1() {
  var v = 100;
  // 在函數(shù)的函數(shù)體中定義另一個函數(shù) -> 內(nèi)部(私有)函數(shù)
  function inner() {
    return v * 2
  }
  return inner
}
var result1 = outer1();
console.log(result1); // [Function: inner]

這樣做的好處是:

  • 有助于我們確保全局名字空間的純凈性(這意味著命名沖突的機會很小)。

  • 確保私有性 — 這使我們可以選擇只將一些必要的函數(shù)暴露給“外部世界”,而保留屬于自己的函數(shù),使它們不為該應(yīng)用程序的其他部分所用。

到此這篇關(guān)于JavaScript中的特殊函數(shù)的文章就介紹到這了,更多相關(guān)js特殊函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 小程序組件之仿微信通訊錄的實現(xiàn)代碼

    小程序組件之仿微信通訊錄的實現(xiàn)代碼

    這篇文章主要介紹了小程序組件之仿微信通訊錄的實現(xiàn)代碼。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • js校驗開始時間和結(jié)束時間

    js校驗開始時間和結(jié)束時間

    這篇文章主要為大家詳細(xì)介紹了js校驗開始結(jié)束時間,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • JS打印方法的幾種方法

    JS打印方法的幾種方法

    本文主要介紹了JS打印方法的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • JavaScript?邏輯或?||?的妙用及相關(guān)知識普及

    JavaScript?邏輯或?||?的妙用及相關(guān)知識普及

    本文給大家介紹了JavaScript中的邏輯或運算符||的用法,包括其基本概念、真值和假值、常見應(yīng)用以及與其他邏輯運算符的對比,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • JS設(shè)計模式之建造者模式的使用方法詳解

    JS設(shè)計模式之建造者模式的使用方法詳解

    JS建造者模式是一種創(chuàng)建型設(shè)計模式,它可以用于構(gòu)建復(fù)雜對象的創(chuàng)建過程,將對象的構(gòu)建步驟和表示分離,以便能夠靈活地構(gòu)建不同的對象,本文將通過代碼示例給大家詳細(xì)的介紹一下JS建造者模式的用法,需要的朋友可以參考下
    2023-08-08
  • Javascript 獲取字符串字節(jié)數(shù)的多種方法

    Javascript 獲取字符串字節(jié)數(shù)的多種方法

    Javascript 字符串字節(jié)數(shù)獲取功能多種方法
    2009-06-06
  • JavaScript+Canvas實現(xiàn)簡單的柱狀圖

    JavaScript+Canvas實現(xiàn)簡單的柱狀圖

    這篇文章主要為大家詳細(xì)介紹了JavaScript如何利用Canvas實現(xiàn)繪制簡單的柱狀圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • Javascript柯里化實現(xiàn)原理及作用解析

    Javascript柯里化實現(xiàn)原理及作用解析

    這篇文章主要介紹了Javascript柯里化實現(xiàn)原理及作用解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • JavaScript30 一個月純 JS 挑戰(zhàn)中文指南(英文全集)

    JavaScript30 一個月純 JS 挑戰(zhàn)中文指南(英文全集)

    JavaScirpt30 是 Wes Bos 推出的一個 30 天挑戰(zhàn)。項目免費提供了 30 個視頻教程、30 個挑戰(zhàn)的起始文檔和 30 個挑戰(zhàn)解決方案源代碼。目的是幫助人們用純 JavaScript 來寫東西,不借助框架和庫,也不使用編譯器和引用
    2017-07-07
  • 5個最佳的Javascript日期處理類庫分享

    5個最佳的Javascript日期處理類庫分享

    在大家日常網(wǎng)站開發(fā)和web應(yīng)用開發(fā)中,我們往往需要有效的調(diào)用Javascript處理日期和時間格式相關(guān)的函數(shù),在Javascript中已經(jīng)包含了部分最基本的內(nèi)建處理方法
    2012-04-04

最新評論

南昌县| 伊春市| 台湾省| 安福县| 刚察县| 宜君县| 汤原县| 通辽市| 连江县| 南岸区| 古丈县| 新野县| 射阳县| 安远县| 长子县| 航空| 北川| 乐亭县| 富源县| 博罗县| 胶南市| 池州市| 建阳市| 平利县| 镇雄县| 武宁县| 屏山县| 龙井市| 重庆市| 额敏县| 屏南县| 昌吉市| 焦作市| 聂荣县| 巴林左旗| 乌鲁木齐市| 大同县| 竹溪县| 武威市| 江山市| 德阳市|