對js中Function的淺見

来源:http://www.cnblogs.com/luqin/archive/2016/02/26/5221911.html
-Advertisement-
Play Games

JS中function的一些淺見


它到底是什麼

String Array 都是系統內置對象(已經定義好,可以直接使用)當然,這貨也是一樣,我們之前定義的函數,其實就是一個這貨的實例。

JS中,所有的對象都是由函數實現的,函數的數據類型是objectSo,我們以前定義的函數也是一個對象。

 

幾種寫法

 1  function fn1(a,b){
 2   return a+b;
 3  }
 4 
 5   //前面表示參數,後面表示函數語句
 6   var fn2 = new Function("a","b","return a+b");
 7 
 8   // 匿名函數
 9   var fn3=function(a,b){
10     return a+b;
11   }
12 
13 
14   console.log(fn1(1,2));
15   console.log(fn2(1,2));
16   console.log(fn3(1,2));    // 註意,一定要在聲明函數的後面調用

 

另外,如果函數沒有明確的返回值,或者調用了沒有參數的return,那麼它真正返回的值是undefined

 1 function fn(){
 2   //.....
 3 }
 4 
 5 
 6 function fn1(){
 7   return;
 8 }
 9 
10 
11 console.log(fn()===undefined);  // true
12 console.log(fn1()===undefined); // true

 

arguments  

arguments只有在代碼運行的時候才起作用,它是一個數組(準確的說是偽數組),保存函數的參數。

 1 function fn(){
 2     var sum=0;
 3     for(var i=0;i<arguments.length;i++){
 4         sum+=arguments[i];
 5     }
 6     return sum;
 7   }
 8 
 9   var sum = fn(1,2);
10   var sum2 = fn(1,2,3);
11   console.log(sum);      // 3
12   console.log(sum2);     // 6
13 
14   function fn1(a,b,c,d){
15       console.log(arguments.length);
16       console.log(arguments[0]);
17   }
18 
19   fn1();                    //  0 、  undefined
20   fn1(1);                   //  1 、 1
21   fn1('a',2);               //  2 、 a
22   fn1('李志',2,3);          //  3 、 李志
23   fn1('李B',2,2,3,4,4);     //  6 、 李B

 

Length

我們需要瞭解兩個東東,形參與實參(不同的資料書籍可能叫法有所差異)

形參:函數定義的時候的參數  實參:調用函數的時候傳遞的參數

length指的是形參個數   arguments.length指的是實參個數

1  function fn(a, b) {
2     console.log(fn.length);
3     console.log(arguments.length);
4  }
5 
6 fn(1, 2);  // 2   2
7 fn(1);     // 2   1

 

call  apply

1,借用另一個對象的方法  2,替換this指向

Apply方法  調用函數,並用指定對象替換函數的this值,同時用指定數組替換函數的參數。

Call方法    調用一個對象的方法,用另一個對象替換當前對象。

 1     //對象1
 2     var obj1={
 3         getAllStudentsNumbers:function(sum,sum1){
 4             return sum+sum1}
 5     };
 6 
 7     //對象2
 8     var obj2={
 9         getDetail:function(){
10             return {name:'阿拉三',age:'18'}
11         }
12     };
13     console.log(obj1.getAllStudentsNumbers.call(obj2,10,200));      // 210
14     console.log(obj1.getAllStudentsNumbers.apply(obj2,[10,200]));   // 210

Function.apply(obj,args)方法能接收兩個參數
obj:這個對象將代替Function類里this對象
args:這個是數組,它將作為參數傳給Functionargs-->arguments

 

我們通過如下方式將其轉換成數組

1 /* slice : 截取數組,返回的還是數組,這裡我們截取全部  */
2 var divs = document.getElementsByTagName("div")
3 var domNodes =  Array.prototype.slice.call(divs);

還可以實現繼承,在上篇文章中說過,這裡不做贅述。

 

caller callee

caller屬性 獲取調用當前函數的函數。caller屬性只有當函數正在執行時才被定義。

返回函數調用者,主要用於察看函數本身被哪個函數調用.

 1     function fn() {
 2         //判斷某函數是否被調用
 3         if (fn.caller) {
 4             alert(fn.caller.toString());
 5         } else {
 6             alert("函數直接執行");
 7         }
 8     }
 9 
10     function fn1() {
11         fn();
12     }
13     fn1();
14     fn();

 

callee屬性 返回正被執行的 Function 對象,即指定的Function 對象的正文。

如下是一個遞歸演算法 計算 1+2+3+4+...+n

什麼是遞歸?    可以這樣理解,一個方法,自己調用自己,用上一次調用得出的結果作為這次的參數。

傳統方式的缺點:

1、破壞了,零重覆法則,當一旦函數名稱更改,需要更改多處

2、fn是一個全局變數,fn內部一般使用局部變數,而這裡是一個全局變數,這是一個潛在的全局變數污染

1 var fn=function(n){
2     return n>0 ? n+fn(n-1) : 0;
3 }
4 console.log('採用傳統方式:'+fn(10));

優點:這樣就讓代碼更加簡練。又防止了全局變數的污染

1 var fn=(function(n){
2     return  n>0 ? n+arguments.callee(n-1) : 0;
3 })(10);
4 console.log('採用callee方式: '+fn);

 

constructor prototype

constructor屬性,就是用來構造對象實例的函數引用。

prototype屬性,獲取對象的原型。

每一個構造函數都有一個prototype屬性,指向另一個對象。這個對象的所有屬性和方法,都會被構造函數的實例繼承。這意味著,我們可以把那些不變的屬性和方法,直接定義在prototype對象上。

 contructorprototype屬性是系統自動生成的。但本質上只是是函數對象的屬性而已。

對象是一個函數,而函數對象含有contructorprototype等屬性,

那麼實例化的過程就是拷貝構造函數屬性的過程,所以每個實例自然就擁有了contructorprototype這兩個屬性。

 

自定義對象:函數實現的--函數又是Function的一個實例,所以這個自定義對象含有Function對象的一切屬性和方法

1 var product = function(){}
2 /*自動有一個 prototype屬性 它是一個對象--- 原型對象*/
3 /* product.prototype也是對象,對象都是函數實現的,這貨也包含Function對象的一切屬性和方法,所以他也有。*/
4 product.prototype.buy=function(){}
5 product.prototype={}

 

bind  toString

Bind方法,創建具有與原始函數相同的主體的綁定函數。 在綁定功能中,this對象解析為傳入的對象。 該綁定函數具有指定的初始參數。

關於Function.prototype.bind(),我們下次專門去討論這個它。

好消息是,IE8以下並不支持。

 

toString  返回對象的字元串表示形式。

 


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

-Advertisement-
Play Games
更多相關文章
  • •低層模塊儘量都要有抽象類或介面,或者兩者都有。 •變數的聲明類型儘量是抽象類或介面。 •使用繼承時遵循里氏替換原則。
  • 在CSS網頁開發佈局中,需要對浮動和定位有深刻的理解才能在開發中游刃有餘。基於此,在博客園中做了本篇總結,這些總結來自實踐經驗和閱讀一些書籍後的理解總結。主要內容為浮動,清除浮動,定位。
  • 編者註:作者以一個運動的小車為例子,講述了三種實現HTML5動畫的方式,思路清晰,動畫不僅僅是canvas,還有css3和javascript.通過合理的選擇,來實現最優的實現。 PS:由於顯卡、錄製的幀間隔,以及可能你電腦處理器的原因,播放過程可能有些不太流暢或者失真! 分三種方式實現: (1)
  • 項目中需要一個下載功能,根據系統跳轉到不同的頁面,如iphone跳轉到IOS頁面,android跳轉到android頁面。 下麵為頁面判斷頁面: <!DOCTYPE HTML> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>手機AP
  • 對象屬性的標簽 value(屬性值), writable(屬性可寫), enumerable(屬性可枚舉), configurable(屬性可配置), 這些屬性標簽使對象所持有的屬性體現出不同的特性, 以便開發者開發使用. value value, 屬性的值, 這個屬性是最直觀的體現, 一個屬性我們
  • 針對underscore.js封裝的方法進行具體的分析
  • 1 $("#jqGridId").setGridParam({url:"數據查詢地址"}).trigger("reloadGrid");
  • 首先Ajax的不刷新頁面提交數據,現在應用非常廣泛,廢話不多說馬上進主題!! 基本上瀏覽器能接收的信息,Ajax都可以接收,ex:字元串,html標簽,css標簽,xml格式內容,json格式內容等等..... <script> // IE瀏覽器 if(ActiveXObject){ // 微軟目前
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...