JavasSript 基礎第四天

来源:http://www.cnblogs.com/wjwcn/archive/2016/07/31/5724155.html
-Advertisement-
Play Games

一、前言 昨天我們瞭解了Js的很重要的一個概念叫做函數,函數就是對於冗餘和垃圾代碼的一種封裝機制。簡單的講就是為了能讓程式更好更快的執行我們將一些重覆性的代碼提取,封裝成一個有名字的小盒子,等到我們需要的時候我們可以直接將盒子拿出來使用。 二、引入 無論是在前端還是後臺語言中函數都是一個個成功程式的 ...


一、前言  

  昨天我們瞭解了Js的很重要的一個概念叫做函數,函數就是對於冗餘和垃圾代碼的一種封裝機制。簡單的講就是為了能讓程式更好更快的執行我們將一些重覆性的代碼提取,封裝成一個有名字的小盒子,等到我們需要的時候我們可以直接將盒子拿出來使用。

 

二、引入

  無論是在前端還是後臺語言中函數都是一個個成功程式的最小封裝模塊,就像搭積木一樣你需要不同的種的模塊來組成一個成品。那麼對於函數來說每一個就應該有它自己的特性以。

三、重點內容

  ㈠  函數的四種形式

    ① 有參數,無返回值(一般沒有返回值的時候預設的返回值都是undefined

function fun(a,b){
    console.log(a+b);
}

    ② 無參數,無返回值(一般用於有代碼復用或者功能性代碼段)

function fun(){
    console.log("Hello World");
}

    ③ 有參數,有返回值(推薦函數可以這麼寫)

function fun(a,b){
    return a+b;
}

    ④ 無參數,有返回值

    

function fun(a,b){
    console.log(a+b);
}
  ㈡ 函數的重載

  

    與後臺語言不同,JS的函數中是沒有函數重載的。說到重載我們就要稍微瞭解一下重載是什麼意思了。

    重載:即函數的命名相同,但是函數的形參個數或者數據類型的不同就會引起不同。簡單的說就是在點名的時候有兩個一模一樣的名字,但是體型確實一胖一瘦。這兩個人都是這個班的同學所以都是存在的。

    在Js當中就沒有重載這一個感念,那麼很多人會問,如果如果我在工作的命名不小心相同了怎麼辦,那麼請看下麵的這段代碼

 

function fun(a,b){
    return a+b;
}
function fun(a,b,c){
    a = a||0;
    b = b||0;
    c = c||0;
    return a+b+c;
}
console.log(fun(1,2));

    我相信很多人去測試這段代碼的時候輸出的結果是3所以認為我上面說錯了。但其實不然如果我們打開測試著工具的一步步調試的時候會發現,函數調用的時候是調用的參數3個函數。那麼為什麼又會等於3呢?因為我在這裡面添加了短路運算來避免錯誤的出現。(不懂短路運算的請翻看Js3天內容)。在Js中是沒有重載的,像上面一樣的定義第一次定義的就會被後面的所覆蓋。

 

  ㈢ 選擇結構

    作用域:即變數所作用的區域; 

      1) 全局作用域:全局作用域的變數就是全局變數。即在整個頁面的任何位置都可以訪問到到。(註意:在函數中不使用var定義的變數也是全局變數)。

      2) 局部作用域:局部作用域的變數就是局部變數。只在函數中可以訪問的。

  ㈣ 匿名函數與函數表達式方式

     在昨天的介紹中我們知道了函數定義的方式是function函數名([參數列表]){函數體};其實還有一中定義的方式就是利用函數表達式命名

var fun = function(){
    return 0;
}

 

    這種方式類似於變數的定義,而其後面的函數沒有名字就被稱作匿名函數。它前面的變數名就可以看做是函數名。

    

    函數表表達式方式和函數命名方式的區別:

    1. 函數的聲明中的函數有名字
    2. 函數表達式中的函數沒有名字,是匿名函數,前面的變數的名字可以看做是函數的名字
    3. 在函數預解析的時候,會先將函數聲明提前到作用域的最前面,而函數表達式不會提升
    4.  函數聲明中的函數,可以在聲明之前調用,但是函數表達式的函數必須在函數表達式之後調用
  ㈤ 函數的預解析

    在程式真正執行之前,會將所有的代碼掃描一遍,將變數的聲明,參數提升到當前作用域的最前面。

function fun(a,b){
    console.log(c);
    console.log(a);
    console.log(b);
    var c = 100;
}
fun(1,2);

    在當前代碼中console.log(c)會列印什麼值呢,我想很多人跟我開始的想法一樣,因為在下麵定義了局部變數c100,所以輸出的時候應該是100.但其實我們都錯了,因為函數要做預解析,所以會把變數的聲明提到當前作用域的最前面如下所示:

 

function fun(a,b){
    var c;
    console.log(c);
    console.log(a);
    console.log(b);
    c = 100;
}
fun(1,2);

 

 

 

    所以c是不會有值得,因為它只有聲明沒有賦值所以返回的是undefined

  ㈥ 自執行函數    
var fun = function(){
    console.log("你好")
};

fun();
(function(){
console.log("你好");

}());

(function(){
    console.log("你好");

})();

 

    因為我們利用了函數表達式的方式定義函數,所以當調用的時候我們可以把小括弧前面的部分用賦值符號右面的部分代替,再將代替的部分用小括弧括起來這樣就形成了自執行函數。

    特點:自執行函數是沒有名字的,定以後馬上調用。多用於一次性使用中。

  ㈦ 回調函數
    var fun = function(a,b,ff){
        return ff(a,b);
}
    console.log(fun(10,20,function(a,b){return a+b ;}))

 

 

    

    是不是看蒙了,那我們稍微分解一下

 function fn(a,b){
        return a+b;
    }
    var fun = function(a,b,ff){
    return ff(a,b);
}
    console.log(fun(10,20,fn));

 

 

    其實回調函數的本質就是把函數當做參數來傳遞。

 

四、總結

    對於函數還是需要多加練習才可以繞明白,我覺得其中最終的一點就是一定要記住每個函數都是有返回值的,有時可能會列印但有時也不會列印。你需要多多的自己判斷。

 

 

 

 

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 一、概述 抽象工廠模式提供一個介面,用於創建相關或依賴對象的家族,而不需要明確指定具體類。可以理解成是多個工廠方法的組合。 二、解決問題 在工廠方法模式中,我們的具體創建者每次使用都只能創建一個同類型的對象,假如我們現在需要的是多個不同類型的對象,工廠方法就滿足不了需求了。這時我們可以把多個工廠方法 ...
  • SPR(The Single Responsibility Principle):單一責任原則 OCP(The Open Closed Principle):開放封閉原則 LSP(The Liskov Substitution Principe):里氏替換原則 DIP(The Dependency ...
  • A集成代碼生成器 [正反雙向(單表、主表、明細表、樹形表,開發利器)+快速構建表單; freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳本,處理類,service等完整模塊B 集成阿裡巴巴資料庫連接池druid; 資料庫連接池 阿裡巴巴的 druid。Druid在 ...
  • 初探MVC Model:負責定義信息格式月信息訪問的界面,包括商業邏輯與信息驗證。 View:負責用戶界面相關呈現,包括輸入與輸出。 Controller:負責控制系統的運行流程、跟瀏覽器的交互、決定網頁操作的流程與動線、響應客戶端的各種要求、錯誤處理等等。 定義數據結構 負責與資料庫溝通 從資料庫 ...
  • 理解深拷貝和淺拷貝之前需要弄懂一些基礎概念,記憶體中存儲的變數類型分為值類型和引用類型。 1、值類型賦值的存儲特點, 將變數內的數據全部拷貝一份, 存儲給新的變數。 例如:var num = 123 ;var num1=num; 表示變數中存儲的數字是 123。然後將數據拷貝一份,就是將 123 拷貝 ...
  • SVG描邊動畫原理其實很簡單,主要利用以下兩個屬性 stroke-dasharray 製作虛線,使得黑白相間, stroke-dashoffset 使得虛線向開頭偏移,這裡的1500不精確,是我隨便取的,下文介紹通過JS獲取長度。 動畫就是減少虛線偏移,那麼實線就會慢慢漏出來了 JS獲取長度 var ...
  • SVG是什麼 SVG是什麼 SVG 指可伸縮矢量圖形 (Scalable Vector Graphics) SVG 用來定義WEB上使用的矢量圖 SVG 使用 XML 格式定義圖形 SVG 圖像在縮放時其圖形質量不會有所損失 SVG 是W3C推薦的 SVG 與諸如 DOM和 XSL 之類的W3C標準 ...
  • ES6新特性之 函數參數的預設值寫法 和 箭頭函數。 1、函數參數的預設值 ES5中不能直接為函數的參數指定預設值,只能通過以下的變通方式: 從上面的代碼可以看出存在一個問題,當傳入的參數為0或者false時,會直接取到後面的值,而不是傳入的這個參數值。 那怎麼解決呢?對於上圖的代碼,可以通過判斷是 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...