ECMAScript5面向對象技術(2)--函數

来源:https://www.cnblogs.com/maxwell0811/archive/2019/07/17/11201899.html
-Advertisement-
Play Games

在JavaScript中,函數其實就是對象。使函數不同於其他對象的決定性特點是函數存在一個被稱為[[Call]]的內部屬性。內部屬性無法通過代碼訪問而是定義了代碼執行時的行為。ECMAScript為JavaScript的對象定義了多種內部屬性,這些內部屬性都用雙重中括弧來標註。 ​[[Call]]屬 ...


在JavaScript中,函數其實就是對象。使函數不同於其他對象的決定性特點是函數存在一個被稱為[[Call]]的內部屬性。內部屬性無法通過代碼訪問而是定義了代碼執行時的行為。ECMAScript為JavaScript的對象定義了多種內部屬性,這些內部屬性都用雙重中括弧來標註。

​[[Call]]屬性是函數獨有的,表明該對象可以被執行。由於僅函數又有該屬性,ECMAScript定義typeof操作符對任何具有[[Call]屬性的對象返回"function"。

創建函數的方式

  • 函數聲明,以function關鍵字開頭,後面跟著函數的名字。函數的內容放在大括弧內;
function add(v1, v2) {
    return v1 + v2;
}
  • 函數表達式,function關鍵字後面不需要加上函數的名字。這種函數被稱為匿名函數,因為函數對象本身沒有名字。取而代之的函數表達式通常會被一個變數或屬性引用。函數表達式的賦值通常在最後有一個分號,就如同其他對象的賦值一樣;
var add = function(v1, v2) {
    return v1 + v2;
};
  • 函數的構造函數(不建議使用,體驗差,調試困難)。
var add = new Function("v1", "v2", "return v1 + v2;");

函數就是值

我們可以像使用對象一樣使用函數,也可以將它們賦給變數,在對象中添加它們,將它們當成參數傳遞給別的函數,或從別的函數中返回。基本上只要是可以使用其他引用值的地方,就可以使用函數。

function sayHi() {
    console.log("Hi!");
}

sayHi();  // outputs "Hi!"

var sayHi2 = sayHi;

sayHi2(); // outputs "Hi!"

參數

  • JavaScript函數的另一個獨特之處在於你可以給函數傳遞任意數量的參數卻不造成錯誤。那是因為函數參數實際上被保存在一個被稱為arguments的類似數組(arguments對象不是一個數組的實例)的對象中;

  • arguments對象自動存在於函數中。也就是說,函數的命名參數不過是為了方便,並不真的限制了該函數可接受參數的個數;

  • 函數期望的參數個數保存在函數的length屬性中。

function reflect(value) {
    return value;
}

console.log(reflect("Hi!")); //  "Hi!"
console.log(reflect("Hi!", 25))  //  "Hi!"
console.log(reflect.length)      //  1

reflect = function() {
    return arguments[0];
}

console.log(reflect("Hi!")); //  "Hi!"
console.log(reflect("Hi!", 25))  //  "Hi!"
console.log(reflect.length)      //  0

重載

​ 大多數面向對象語言支持函數重載,它能讓一個函數具有多個簽名。JavaScript函數可以接受任意數量的參數且參數類型完全沒有限制。這說明JavaScript函數其實根本沒有簽名,因此也不存在重載。在JavaScript里,當試圖定義多個同名的函數時,只有最後定義的有效,之前的函數聲明被完全刪除,只使用最後那個。

function say(msg) {
   console.log(msg);
}

function say() {
   console.log("Default message");
}

say("Hello");  // 輸出"Default message"

​ JavaScript函數沒有簽名這個事實不意味著不能模仿函數重載,可以使用arguments對象獲取傳入的參數個數並決定怎麼處理。

function say(msg) {
   if(arguments.length === 0) {
      msg = "Default message";
   }
   console.log(msg);
}

say("Hello");  //輸出"Hello!"

對象方法

如果對象屬性的值是函數,則該屬性被稱為方法

this對象

​ JavaScript所有的函數作用域內都有一個this對象代表調用該函數的對象。在全局作用域中,this代表全局對象。當一個函數作為對象的方法被調用時,預設this的值等於那個對象。

var person = {
   name : "Tom",
   sayName : function() {
       console.log(this.name);
   }
};

person.sayName(); //輸出"Tom"

改變this

​ 在JavaScript中,函數會在各種不同上下文中被使用,它們必須到哪都能正常工作。一般this會被自動設置,但是可以改變它的值來完成不同的目標。有3種函數方法允許你改變this的值(記住函數的對象,而對象可以有方法,所以函數也有)。

  • call()方法

第一個參數指定函數執行時this的值,其後的所有參數都是需要被傳入函數的參數。

function sayName(label) {
    console.log(label + ":" + this.name);
}

var person1 = {
    name : "Tom"
};

var person2 = {
    name : "Bob"
}

var name = "Peter";

sayName.call(this, "global");    //global:Peter
sayName.call(person1, "person1");//person1:Tom
sayName.call(person2, "person2");//person2:Bob
  • apply()方法

工作方式和call()完全一樣,只接受兩個參數:this的值,一個數組。

function sayName(label) {
    console.log(label + ":" + this.name);
}

var person1 = {
    name : "Tom"
};

var person2 = {
    name : "Bob"
}

var name = "Peter";

sayName.apply(this, "global");       //global:Peter
sayName.apply(person1, "person1");   //person1:Tom
sayName.apply(person2, "person2");   //person2:Bob
  • bind()方法

bind方法用於將函數體內的this綁定到某個對象,然後返回一個新函數。

function sayName(label) {
    console.log(label + ":" + this.name);
}

var person = {
    name : "Tom"
};

//create a function just for person1
var sayNameForPerson = sayName.bind(person1);
sayNameForPerson1("person"); // "person:Tom"

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

-Advertisement-
Play Games
更多相關文章
  • JsonServer 主要的作用就是搭建本地的數據介面,創建json文件,便於調試調用 是一個 Node 模塊,運行 Express 伺服器,可以指定一個 json 文件作為 api 的數據源 官網:https://www.npmjs.com/package/json-server 安裝全局的jso ...
  • 在曾經,我們只能用A.indexof(B)來判斷A中是否含有B字元串; 現在在ES6中 有了: includes(), startswith(),endswith() reapt()重覆次數; 輸出 `是一個新增的運算符,表示模板字元串。 輸出: 好高興啊,我買了一個手機,花了10元,我很高興啊!、 ...
  • 內邊距和外邊距之間即為border,可以設置邊框,改變外觀; 而邊距可以調整齣所有想要的距離效果。 補充: ...
  • 前些日子無聊的時候學了下前端,說實話沒有美感前端和搬磚沒有區別,唯一值得一提的就是他的佈局方法。我的這個方法用於寫死網頁,不含各種框架的自適應性功能,而且主要想記錄一下思想。 寫前端不同於演算法優化,演算法中經常是能少一個數組就少一個數組,而前端只要保證不亂,多套幾個div沒有任何關係,也沒人會深究你浪 ...
  • 在我們進入主題前,我先先看下獲取網址URL的方法: window.location.href // 設置或獲取整個URL為字元串 window.location.hash // 設置或獲取href屬性中在井號#後面的部分參數 window.location.search // 設置或獲取href屬性 ...
  • 摘要: mpvue中頁面之間傳值(註意:是頁面之間,不是組件之間) 場景:A頁面跳轉B頁面,在B頁面選擇商品,將商品名帶回A頁面並顯示 使用api: getCurrentPages step1: A頁面js: 先定義一個全局的對象that,然後在mouted中把this賦給that step2: B ...
  • 摘要: 小程式索引選擇器,點擊跳轉相應條目,索引可滑動,滑動也可跳轉 場景:城市選擇列表, 汽車品牌選擇列表 所用組件: scroll-view(小程式原生) https://developers.weixin.qq.com/miniprogram/dev/component/scroll-view ...
  • 微信小程式開發實戰教程 一、微信小程式 它是一種混合開發的方式。 是安裝在微信中的程式(一個程式最多2M空間)。 1.1 註冊 1 2 點擊立即註冊:進入下方頁面 3 4 點擊小程式進入表單填寫頁面 5 6 填寫完畢之後提交,會讓你去郵箱中激活。激活之後就可以進入小程式開發了。 1.2 安裝開發工具 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...