引用類型之Function類型

来源:http://www.cnblogs.com/zhouliang/archive/2016/10/13/5957526.html
-Advertisement-
Play Games

Function類型 ECMAScript中最有意思的就是函數了,有意思的根源,在於函數實際上是對象。每個函數都是Function的實例,具有屬性和方法。而重要的一點是,函數名,不過是指向函數的指針,不會與某個函數綁定。 1.函數定義 (1)創建函數有函數聲明法和函數表達式法。(2)函數名僅僅是指向 ...


Function類型

ECMAScript中最有意思的就是函數了,有意思的根源,在於函數實際上是對象。每個函數都是Function的實例,具有屬性和方法。而重要的一點是,函數名,不過是指向函數的指針,不會與某個函數綁定。

1.函數定義

(1)創建函數有函數聲明法和函數表達式法。(2)函數名僅僅是指向函數的指針,所以一個函數可能會有多個名字。(3)函數沒有重載,後面會覆蓋前面。(4)函數聲明會最先被解析,而函數表達式則不會。

 1 alert(sum(10,10));
 2 function sum(num1,num2){
 3     return num1+num2;
 4 };                               //函數聲明定義函數,會被率先解析,即使在函數聲明之前調用函數,也不會報錯
 5 
 6 var sum=function(num1,num2){
 7     return num1+num2;
 8 };                               //函數表達式定義函數,不會被率先解析,如果在之前調用函數,會報錯
 9 
10 
11 
12 function sum(num1,num2){         //函數名僅僅是指向函數的指針,換句話說,一個函數可以有多個名字  
13     return num1+num2;
14 };
15 alert(sum(10,10));               //20
16 var anotherSum=sum;              //註意,使用不帶括弧的函數名是訪問函數指針,而非調用函數,寫成sum()就變成調用函數了
17 alert(anotherSum(10,10));        //20
18 sum=null;
19 alert(anotherSum(10,10));        //20,即使將sum設置為null,任然可以正常調用anotherSum()
20 
21 
22 
23 function addSomeNumber(num){
24     return num+100;
25 };
26 function addSomeNumber(num){
27     return num+200;
28 };
29 var result=addSomeNumber(100);  //300,將函數名想象成指針,就能理解為什麼沒有重載,後面的會覆蓋前面的
30 alert(result);

 2.函數作為值

ECMAScript中的函數名本身就是變數,所以,函數也可以作為值來始用。不僅可以將函數當作參數來傳遞,而且可以當做另一個函數的結果返回。從一個函數中返回另一個函數,而是極其有用的方法。

 1 /*作為值的函數*/
 2 function callSomeFunction(someFunction,someArgument){
 3     return someFunction(someArgument);
 4 };                                                        //第一個參數應該是一個函數,第二個參數應該是要傳遞給該函數的一個值
 5 
 6 function add10(num){
 7     return num+10;
 8 };
 9 var result=callSomeFunction(add10,10);
10 alert(result);                                            //20
11 function getGreeting(name){
12     return "Hello,"+name;
13 };
14 var result2=callSomeFunction(getGreeting,"Blue Beginner");
15 alert(result2);                                           //"Hello,Blue Beginner",需要註意的是,訪問函數的指針而不是調用函數的話,一定不要帶括弧
16 
17 
18 /*從一個函數中返回另一個函數,這是極為有用的方法*/
19 function creatComparisonFunction(propertyName){
20     return function(object1,object2){
21         var value1=object1[propertyName];
22         var value2=object2[propertyName];
23         return value2-value1;                          //此處為一個比較函數
24     };
25 };
26 var data=[{name:"Zachary",age:28},{name:"Nicholas",age:29}];
27 data.sort(creatComparisonFunction("name"));
28 alert(data[0].name);                                      //Zachary
29 data.sort(creatComparisonFunction("age"));
30 alert(data[0].name);                                      //Nicholas

3.函數的屬性和方法

(1)函數內部有兩個特殊的對象:arguments和this。arguments用來保存函數的參數,它有一個callee的屬性,指向擁有這個arguments的函數。this引用的是函數執行的環境對象。

(2)每個函數都包含兩個屬性:length和prototype。length:參數的個數。prototype:最耐人尋味,對於ECMAScript中的引用類型而言,它是保存所有實例方法的真正所在。

(3)每個函數都包含兩個非繼承而來的方法:apply(),call(),用途是在特定的作用域中調用函數。強大在,擴充函數的作用域。

(4)ECMAScript5還定義的一個bind()方法。該方法會創建一個函數的實例。

 1 /*函數的內部屬性*/
 2 function factorial(num){                        //這是一個經典的階乘函數
 3     if(num<=1){
 4         return 1;
 5     }else{
 6         return num*arguments.callee(num-1);     //這裡,不用factorial(num-1)
 7     }
 8 };
 9 var trueFactorial=factorial;
10 factorial=function(){
11     return 0;
12 };
13 alert(trueFactorial(5));                         //120
14 alert(factorial(5));                             //0
15 //將factorial值賦給trueFactorial後,後者便擁有了arguments,這樣,中途改變factorial,階乘函數照樣有用,而此時的factorial只是一個返回0的函數罷了
16 
17 function outer(){
18     inner();
19 };
20 function inner(){
21     alert(inner.caller);
22 };
23 outer();
24 /*caller*/
25 
26 
27 
28 /*函數的屬性和方法*/
29 window.color="red";
30 var o={color:"blue"};
31 function sayColor(){
32     alert(this.color);
33 };
34 sayColor();               //red
35 sayColor.apply(this);     //red
36 sayColor.apply(window);   //red
37 sayColor.apply(o);        //blue
38 
39 
40 window.color="red";
41 var o={color:"blue"};
42 function sayColor(){
43     alert(this.color);
44 };
45 var objectSayColor=sayColor.bind(o);
46 objectSayColor();                       //blue

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 踩過的坑都將成為路上的風景。隊友在cookie中已存以下值: 仔細觀摩,並無發現任何不妥,只是一種簡簡單單的json格式字元串而已。 但在前臺調用時,百試不爽,屢屢出錯,錯誤代碼如下,一直顯示undefined ... 充電之後 ... 加上JSON.parse()處理後,完美解決 相關學習: JS ...
  • 1.等腰三角形 2.直角三角形 3.圓 4.橢圓 ...
  • css參考手冊: http://www.phpstudy.net/css3/ http://www.css88.com/book/css/ ...
  • 一、JS實現瀑布流 index.html:頁面結構 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>瀑布流佈局</title> 6 <link rel="stylesheet" href= ...
  • [1]queue() [2]dequeue() [3]clearQueue() ...
  • 聖杯佈局和雙飛翼佈局主要用來解決以下問題: 1.三列佈局,兩側定寬,中間自適應。2.中間欄在瀏覽器中優先載入渲染。 解決思路: 首先把中間的div寫到前面,然後左側,然後右側。這樣就解決了第二個問題,中間的div優先渲染。 但是這樣會存在一個問題,寫到前面的也會顯示在前面。 為瞭解決這個問題,我們讓 ...
  • 構建了公司網站之後,接下來就可以考慮設計一個線上商店了。 此次的設計以上一章的設計為基礎, 只是添加了一個包含如下元素的新頁面: □ 包含商品小圖、標題和說明的產品網格; □ 位於左側的變懶,用於按類別、品牌等篩選商品; □ 方便用戶導航的麵包屑和分頁鏈接。 大家先看一看Zappos (http:/ ...
  • 對於網址欄的URL不同的操作方式有不同的載入資源、獲取數據的方式,下麵的詳細過程針對"在地址欄輸入URL,按enter(回車)鍵載入資源"此種操作方式做解析,其它的方式的過程大同小異,差異會在後面再做分析。 1. 瀏覽器開啟一個線程來處理這個請求,對URL判斷如果是http協議就按照web方式處理; ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...