1. 程式人生 > >[js點滴]JavaScript關於函式總結

[js點滴]JavaScript關於函式總結

    /*1.函式的概念   
    函式就是實現某一功能的程式碼片段.
      2.函式的分類
      a.預定義函式(系統函式)
      b.自定義函式
      函式又稱之為方法
      3.函式定義
      function 函式名(引數1,引數2,引數3,...){
        函式主體
      }
     注意兩點:
     a.function為關鍵字,用來定義函式;
     b.函式名必須是唯一的.   

     4.函式的寫法:
    */
//   4.1 function 關鍵字寫法
     function test(){
        console.log("12343"
); } // 4.2 函式表示式寫法(匿名函式),採用變數賦值的寫法 var fun = function(){ console.log("xasc"); }; /* 注意: 1.賦值語句的等號右側只能放表示式,這種寫法是將匿名函式賦值給變數. 2.採用函式表示式寫法,function後面不能帶有函式名,如果加上函式名,該函式名只在函式主體內部有效 3.函式表示式語句後面要加上分號. var fun1 = function func(){ alert(typeof func); console.log("xasc"); }; fun1(); alert(typeof func); */
//4.3 Function建構函式建立函式物件 var test = new Function( 'x', 'y', 'return (x+y)' ) //等價於 function test1(x,y){ return x+y; } /*解釋: 1.Function建構函式裡面三個引數,第1,2個引數表示引數,第3個引數表示函式的實現主體 2.該種寫法非常不直觀,幾乎無人使用這種寫法 */ //5.函式的重複定義 function t1(){ console.log("t1"); } t1();//t2 function t1(){ console.log("t2"
); } t1();//t2 /*注意: 如果兩個函式的函式名一樣,後一次的函式定義會覆蓋前一個函式定義,由於存在函式名的提升,前一次定義在任何時候都是無效的. */ //6.函式呼叫 function t2(){ } t2();//表示函式的呼叫 function t3(a,b){ return a+b; } t3(1,2);//有參函式的呼叫 //7.函式名的提升 /*在js當中,把函式名等視為變數名,所以一般採用function來定義(第一種方式定義的函式)的函式,整個函式會像變數定義一樣,被提升到程式碼的頭部. * */ funct(); function funct(){ console.log("adas"); } /*解釋: funct()在函式的定義之前進行了呼叫,由於該種方法定義的函式存在函式名的提升,函式funct會自動提升到程式碼的頭部,也就是在呼叫之前已經聲明瞭. fu();//函式的呼叫 fu is not a function var fu = function() { console.log("fu"); } */ //8.如果採用function和函式表示式形式來定義同一個函式,最後總是採用函式表示式形式定義的函式 var fus = function(){ console.log("aaaa"); } function fus(){ console.log("bbbb"); } fus();//aaaa //9.ECMA規定,不得在非函式的程式碼塊中定義函式,如:在if或者try語句中 /*if(false){ function fus2(){ console.log("123"); } } fus2(); */ //10.函式的屬性 var s = function(){ console.log("xs"); } function ss(){ } //10.1 name屬性 返回函式function後面的函式名. console.log(s.name);//"" console.log(ss.name);//"ss" //10.2 length 屬性 返回的是定義函式時引數的個數. function sss(a,b,c){ } sss(1,2); sss.length;//3 //10.3 函式toString() 以字串形式返回函式的原始碼 //function ssss(){ // //返回值 // return "ABC"; //} //ssss.toString(); //"function ssss(){\ // //返回值\ // return "ABC";\ //}\ //" //注意:函式中的註釋也會輸出出來 //11.函式內部的變數提升 function add(x){ if(x>0){ var temp = x+100; } } /*相當於 function add(x){ var temp; if(x>0){ temp = x+100; } } 注意:與全域性變數一樣,函式內部的變數,也會發生一個變數名的提升現象,var 宣告的變數,無論在函式內什麼位置,變數名都會提升到函式體的頭部. */ //12.函式的作用域 var sub = function(){ function sub1(){ console.log("sub1"); } } //sub1();//訪問不到,sub1是區域性變數,可見範圍只在它所在的父級區域 //13.函式的引數 function s10(a,b){ return a+b; } var result = s10(2,12); /* 注意: 1.a,b是s10函式的兩個引數,且引數前面不能加var. 2.在js當中函式的引數不是必須的,在呼叫時允許省略 3.在js中呼叫函式時,無論提供多少個引數,都不會報錯的 4.在js中如果呼叫函式時,想少傳一個引數,則需要把不傳的那個引數設定成undefined,例如:s11(undefined,23) */ s10(12,13);//25 alert(s10(12,23,12,14));//35 s10();//undefined s10.length;//2 function s11(a,b){ return b; } alert(s11(undefined,23));//正常 23 //14.為函式引數設定預設值 function s14(a){ a = a || 1; return a; } alert(s14(10)); //15.同名引數 //1.同名引數,取最後引數出現的那個值 //2.如果引數都是b,則以後面的引數b為準,即使後面b沒有值或值被省略,依舊以最後一個引數為準 function s15(b,b,b){ console.log(b); } s15(12);//這裡省略了後面的兩個引數,所以b的取值為undefined. /* 16.arguments物件 1.由於js中允許函式有不定數目的引數,為了讓這些引數不丟失,所以這些引數全部儲存在arguments物件裡面 2.arguments包含了程式執行時的所有引數,arguments[0]第一個引數,arguments[1]第二個引數,以此類推. */ //閉包函式 function fun1(){ var n = 1000; function fun2(){ console.log(n); } return fun2; } var res1 = fun1(); res1(); /*解釋:函式fun1返回值是fun2函式, fun2函式中可以讀取到fun1中的變數n,所有在外部就可以獲得fun1函式中的變數n了. 閉包就是函式fun2,也就是能夠讀取其他函式中的變數的函式. 閉包的定義:就是定義在函式內部的函式,它的本質就是將函式內部與函式外部連線在一起的一個橋樑. */ function fun3(a){ function fun4(b){ return a++; } return fun4; } var f = fun3(12); var s1 = f(0);//12 var s2 = f(0);//13 var s3 = f(0);//14 //閉包函式的兩個作用: //1.可以讀取函式內部的變數 //2.讓這些變數始終儲存在記憶體中,一直存在. /*缺點: 記憶體消耗很大,會造成網頁效能問題 */ // 立即執行函式 //1.常規方法 // function(){ // console.log("123"); // } // f();//函式呼叫 // 2.立即呼叫函式表示式 //(function(){})(); // 或者 // (function(){}()); // 注意:最後一個圓括號,是向內部傳遞引數用的 (function(){ console.log("123"); })(); //2.eval()將字串當做語句執行 eval('var a = 13');//相當於var a = 13; alert(a);//13 var b = 14; eval('b = 15');//a = 15 alert(b);//15 // var tr = function(a,b){ // return a+b; // } // tr(12,13); (function(a,b){ return a+b; }(12,13));