第122篇: JS函數一些基本概念

来源:https://www.cnblogs.com/FatTiger4399/archive/2023/02/24/17153226.html
-Advertisement-
Play Games

好家伙,本篇為《JS高級程式設計》第十章“函數”學習筆記 1.函數的三種定義方式:函數表達式、函數聲明及箭頭函數 函數聲明: function sum(a) { return a + 1; } 函數表達式: let sum= function(a){ return a + 1; } 箭頭函數: le ...


好家伙,本篇為《JS高級程式設計》第十章“函數”學習筆記

 

1.函數的三種定義方式:函數表達式、函數聲明及箭頭函數

函數聲明:

function sum(a) { 
 return a + 1; 
} 

函數表達式:

let sum= function(a){
return a + 1;
}

 

箭頭函數:

let sum = (a) => { 
 return a + 1; 
} 

 

以函數聲明方式聲明的函數存在"函數聲明提升",

在執行代碼時,JavaScript 引擎會先執行一遍掃描, 把發現的函數聲明提升到源代碼樹的頂部。

因此即使函數定義出現在調用它們的代碼之後,引擎也會把 函數聲明提升到頂部。

而函數表達式這麼做會報錯(箭頭函數同樣報錯)

 

 

 代碼如果沒有執行到函數表達式的那一行,那麼執行上下文中就沒有函數的定義

 

 

 

2.函數名

函數名是指向函數的指針,所以它們跟其他包含對象指針的變數具有相同的行為

function sum(num1, num2) { 
 return num1 + num2; 
} 
console.log(sum(10, 10)); // 20 

let anotherSum = sum;
console.log(anotherSum(10, 10)); // 20
sum = null;
console.log(anotherSum(10, 10)); // 20

以上代碼定義了一個名為 sum()的函數,用於求兩個數之和。

然後又聲明瞭一個變數 anotherSum, 並將它的值設置為等於 sum。

註意,使用不帶括弧的函數名會訪問函數指針,而不會執行函數。

此時, anotherSum 和 sum 都指向同一個函數。

調用 anotherSum()也可以返回結果。把 sum 設置為 null 之後,就切斷了它與函數之間的關聯。

而 anotherSum()還是可以照常調用,沒有問題。(有意思,之前不清楚)

 

ECMAScript 6 的所有函數對象都會暴露一個只讀的 name 屬性,其中包含關於函數的信息。

多數情 況下,這個屬性中保存的就是一個函數標識符,或者說是一個字元串化的變數名。

即使函數沒有名稱, 也會如實顯示成空字元串。

function AAA(){}

let BBB =function (){}

let CCC =()=>{}

console.log(AAA.name);
console.log(BBB.name);
console.log(CCC.name);
console.log((()=>{}).name);

 

 

 

 (最後一行有東西的,空字元)

 

 

3.參數

ECMAScript 函數的參數跟大多數其他語言不同。

ECMAScript 函數既不關心傳入的參數個數,也不 關心這些參數的數據類型。

定義函數時要接收兩個參數,並不意味著調用時就傳兩個參數。

你可以傳一 個、三個,甚至一個也不傳,解釋器都不會報錯。(好家伙)

 

4.沒有重載

js沒有重載

(這可真是太有意思了,方法名是指針,參數不管數量,我想js自然是不會有重載的)

方法後定義覆蓋先定義(記住了,要考的)

function add(num) { 
 return num + 100; 
} 
function add(num) { 
 return num + 200; 
} 
let result = add(100); // 300 

顯然,定義兩個同名參數,後定義的會覆蓋先定義的

 

5.arguments屬性

arguments 是一個類數組對象,包含調用函數時傳入的所有參數。

 

function test(a,b,c,d,e){
    console.log(arguments)
}

test(1,2,3,4);

 

 

 

 

 

 

 

5.1.arguments.callee

arguments 對象其實還有一個 callee 屬性,是一個指向 arguments 對象所在函數的 指針。

想不出什麼好的例子,就用書中的原例吧:

(書中原例)

一個階乘遞歸

function factorial(num) { 
 if (num <= 1) { 
   return 1; 
 } else { 
   return num * factorial(num - 1); 
 } 
} 

隨後用arguments.callee代替factorial

function factorial(num) { 
 if (num <= 1) { 
   return 1; 
 } else { 
   return num * arguments.callee(num - 1); 
 } 
} 

 

這時候可能有人會問了,這有什麼屌用.我剛開始也是這麼想的,後來又看了兩遍,發現js開發者還是有點東西的

使用 arguments.callee 就可以讓函數邏輯與函數名解耦

 

我們接著看:

(重要的一個例子)

function factorial(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * arguments.callee(num - 1);
    }
}

let trueFactorial = factorial;

factorial = function () {
    return 0;
};
console.log(trueFactorial(5)); // 120 
console.log(factorial(5)); // 0 

 

 

 

 

 

這段就有意思了,

trueFactorial 變數被賦值為 factorial,所以console.log(trueFactorial(5));結果為120;

但是console.log(factorial(5)); 結果又為0;

trueFactorial 不受factorial方法重寫的影響

 

這一個例子就幫我們記住了三個知識點:

1.函數名真的是指針

2.使用 arguments.callee 就可以讓函數邏輯與函數名解耦

3.js有重寫,莫得重載

 

6.caller屬性

caller屬性引用的是調用當前函數的函數,或者如果是 在全局作用域中調用的則為 null。

function outer() { 
 inner(); 
} 
function inner() { 
 console.log(arguments.callee.caller); 
} 
outer(); 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 準備工作 下載安裝vagrant https://releases.hashicorp.com/vagrant/2.3.4/vagrant_2.3.4_windows_amd64.msi 選擇自己需要的版本傻瓜式安裝 下載安裝vartualbox https://download.virtualbo ...
  • 前言 在K8s的Node節點上經常有其他進程和Pod爭搶記憶體資源,導致該Node出現OOM現象,最終導致運行在該Node節點上Pod被OS給Kill掉; 採用監控系統和日誌系統對該現象進行監控報警,並通過日誌系統收集的日誌進行佐證; 一、Top命令 我們平時會部署一些應用到Linux伺服器,所以經常 ...
  • 前言 Redis中有5大數據類型,分別是字元串String、列表List、集合Set、哈希Hash、有序集合Zset,本篇介紹Redis的字元串String #Redis字元串 String是Redis最基本的類型,你可以理解成與Memcached一模一樣的類型,一個key對應一個value Str ...
  • 2月15日,數倉軟體巨頭Teradata宣佈根據其對中國當前和未來商業環境的慎重評估,將逐步結束在中國的直接運營,後續進入中國公司的關閉程式。 一石激起千層浪,這一消息,在國內的To B市場引起了廣泛關註。Teradata這家進入中國市場26年,為國內數倉發展帶來重要啟蒙,奠定數據服務人才基礎,被業 ...
  • 前言 redis安裝在Linux伺服器上,系統為centos7,安裝的版本為redis6.2.10 下載與安裝 下載地址:https://redis.io/download/#redis-downloads 點擊上面的鏈接就能進入redis下載頁面,最新的目前是7.0 這裡使用的是6.2.10的版本 ...
  • 閱識風雲是華為雲信息大咖,擅長將複雜信息多元化呈現,其出品的一張圖(雲圖說)、深入淺出的博文(雲小課)或短視頻(雲視廳)總有一款能讓您快速上手華為雲。更多精彩內容請單擊此處。 摘要:Hue是一組WEB應用,用於和MRS大數據組件進行交互,能夠幫助用戶瀏覽HDFS,進行Hive查詢,啟動MapRedu ...
  • 前言: 關於ro.serialno這個屬性,相信大家都不陌生了,應用層的Build.getSerial(),Build.SERIAL等均是直接或間接的獲取了這個屬性值。接下來從boot到系統應用,小小的分析一下它的整個流程: 由於是APP經常使用,那我們從應用層分析到底層kernel/boot 一, ...
  • Xcode作為日常開發iOS程式的IDE,支持C、C++、Objective-C、Swift、Ruby等語言進行編寫。日常開發入口就是Xcode workspace或者Xcode project。 workspace是一個Xcode文檔,它將項目和其他文件、project分組。一個workspac... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...