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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...