對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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...