溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

函數(shù)Function怎么用

發(fā)布時間:2021-12-03 14:03:12 來源:億速云 閱讀:181 作者:小新 欄目:編程語言

這篇文章主要介紹了函數(shù)Function怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

函數(shù)Function

1、概述:函數(shù)是完成特定任務的可重復調(diào)用的代碼段,是JavaScript組織代碼的單位 。
2、功能:將代碼組織為可復用的單位,可以完成特定的任務并返回數(shù)據(jù)

3、函數(shù)定義:
 3.1、JavaScript的函數(shù)屬于Function對象,因此可以使用Function對象的構(gòu)造函數(shù)來創(chuàng)建一個函數(shù) 。
 3.2、可以使用function關(guān)鍵字以普通的形式來定義一個函數(shù)
   如:
   var say = Function([參數(shù)列表]){語句;[return 表達式]}   //函數(shù)變量
   function 函數(shù)名([參數(shù)列表]){語句;[return 表達式]}    //普通函數(shù)
 
4、函數(shù)指針調(diào)用方式
 回調(diào) :其機制是通過指針來調(diào)用函數(shù) 。
 一般函數(shù)的調(diào)用方式是常見而且普通的,但JavaScript中函數(shù)調(diào)用的形式比較多,非常靈活。
 有一種重要的、在其它語言中也經(jīng)常使用的調(diào)用形式叫做回調(diào) 。回調(diào)函數(shù)按調(diào)用者的照約定
 實現(xiàn)函數(shù)的功能,由調(diào)用者調(diào)用

函數(shù)返回類型
一般情況下,函數(shù)返回的非對象數(shù)據(jù)都使用值返回方式
引用類型返回的是數(shù)據(jù)的地址,而不是數(shù)據(jù)本身 。
引用傳遞的優(yōu)點是速度快,但系統(tǒng)會為維護數(shù)據(jù)而付出額外的開銷。通常返回復合類型數(shù)據(jù)時使用引用傳遞方式
function getNameList(){
 var list = new Array("張三","李四","王五");
 return list ;  //返回引用
}
var nameList = getNameList() ;
nameList = null ;  //刪除引用

返回函數(shù) :函數(shù)可以返回一個函數(shù)指針
外部代碼可以通過指針調(diào)用其引用的函數(shù)對象,調(diào)用方式和一般函數(shù)完全一樣。
一般情況下私有函數(shù)不能被外界直接調(diào)用,因此可以將一個私有函數(shù)的地址作為結(jié)果返回給外界使用

function getSum(){
 function sum(a,b){
  return a+b ;
 }
 return sum ;
}
var sumOfTwo = getSum() ;
var total = sumOfTwo(1,2) ;


函數(shù)的作用域
公有函數(shù):是指定義在全局作用域中,每一個代碼都可以調(diào)用的函數(shù) 。
私有函數(shù) :是指處于局部作用域中的函數(shù) 。當函數(shù)嵌套定義時,
子級函數(shù)就是父級函數(shù)的私有函數(shù)。外界不能調(diào)用私有函數(shù),私有函數(shù)
只能被擁有該函數(shù)的函數(shù)代碼調(diào)用 。


function a(){
 alert("a");
 function b(){
  alert("b");
  function c(){
   alert("c");
  }
 }
 b(); //可以
 c(); //不可以
}
a();  //調(diào)用a

view plaincopy to clipboardprint?
//定義通用排序函數(shù)  
function sortNumber(obj,func){            
   //參數(shù)驗證,如果不是指定參數(shù)類型則拋出異常  
   if(!(obj instanceof Array)||!(func instanceof Function)){  
       var e = new Error();    //生成錯誤信息  
       e.number = 100000 ; //定義錯誤號  
       e.message = "參數(shù)無效" ;//錯誤描述  
       throw e ;       //拋出異常  
   }else{    
       for(n in obj){              //開始據(jù)排序  
           for(m in obj){    
               if(func(obj[n],obj[m])){    //使用回調(diào)函數(shù)排序,規(guī)則由用戶設定  
                   var temp = obj[n] ; //創(chuàng)建臨時變量  
                   obj[n] = obj[m] ;   //交換數(shù)據(jù)  
                   obj[m] = temp ;  
               }  
           }          
       }  
   }  
   return obj ;                //返回排序后的數(shù)組  
}  
 
//回調(diào)函數(shù),用戶定義的排序規(guī)則  
function greatThan(arg1,arg2){        
   return arg1>arg2 ;       //規(guī)則:從大到小  
}  
 
try{  
   var numAry = new Array(5,8,6,32,1,45,7,25); //生成一數(shù)組  
   pf("排序前:"+numAry);            
   sortNumber(numAry,greatThan);               //調(diào)用排序函數(shù)  
   pf("排序后:"+numAry);  
}catch(e){                                      //捕捉異常  
   alert(e.number+" : "+e.message);            //異常處理  
}  
//定義通用排序函數(shù)
function sortNumber(obj,func){  
//參數(shù)驗證,如果不是指定參數(shù)類型則拋出異常
if(!(obj instanceof Array)||!(func instanceof Function)){
 var e = new Error(); //生成錯誤信息
 e.number = 100000 ; //定義錯誤號
 e.message = "參數(shù)無效" ;//錯誤描述
 throw e ;  //拋出異常
}else{
 for(n in obj){    //開始據(jù)排序
  for(m in obj){
   if(func(obj[n],obj[m])){ //使用回調(diào)函數(shù)排序,規(guī)則由用戶設定
    var temp = obj[n] ; //創(chuàng)建臨時變量
    obj[n] = obj[m] ; //交換數(shù)據(jù)
    obj[m] = temp ;
   }
  }  
 }
}
return obj ;    //返回排序后的數(shù)組
}

//回調(diào)函數(shù),用戶定義的排序規(guī)則
function greatThan(arg1,arg2){  
return arg1>arg2 ;  //規(guī)則:從大到小
}

try{
var numAry = new Array(5,8,6,32,1,45,7,25); //生成一數(shù)組
pf("排序前:"+numAry);  
sortNumber(numAry,greatThan);    //調(diào)用排序函數(shù)
pf("排序后:"+numAry);
}catch(e){          //捕捉異常
alert(e.number+" : "+e.message);   //異常處理
}

函數(shù)的長度屬性

Function.length : 是一個只讀的屬性,它返回函數(shù)定義的參數(shù)個數(shù)
   arguments 返回我們調(diào)用函數(shù)時傳遞的參數(shù)列表

view plaincopy to clipboardprint?
function check(args) {  
   var actual = args.length;           // 實際參數(shù)個數(shù)  
   var expected = args.callee.length;  // 期望參數(shù)個數(shù)  
   if (actual != expected) {    
       //當實參與形參個數(shù)不匹配時拋出異常  
       throw new Error("錯誤的參數(shù)個數(shù);形參數(shù)為: " + expected + ", 實際傳參數(shù)為: " + actual);  
   }  
}  
 
function f(x, y, z) {      
   var result = 0 ;              
   try{  
       //檢查實參與形參是否匹配  
       check(arguments);                      
       result =  x + y + z;  
   }catch(ex){  
       document.write("
出錯啦!錯誤消息: "+ex.description);                    
   }  
   return result;                        
}  
 
document.write("
調(diào)用形式為:f(1,2,3)其結(jié)果為:
t"+f(1,2,3));  
document.write("
調(diào)用形式為:f(1,2)其結(jié)果為:
t"+f(1,2));  
function check(args) {
   var actual = args.length;           // 實際參數(shù)個數(shù)
   var expected = args.callee.length;  // 期望參數(shù)個數(shù)
   if (actual != expected) {  
    //當實參與形參個數(shù)不匹配時拋出異常
       throw new Error("錯誤的參數(shù)個數(shù);形參數(shù)為: " + expected + ", 實際傳參數(shù)為: " + actual);
   }
}

function f(x, y, z) {
var result = 0 ;      
   try{
    //檢查實參與形參是否匹配
    check(arguments);        
    result =  x + y + z;
}catch(ex){
 document.write("
出錯啦!錯誤消息: "+ex.description);    
}
return result;        
}

document.write("
調(diào)用形式為:f(1,2,3)其結(jié)果為:
t"+f(1,2,3));
document.write("
調(diào)用形式為:f(1,2)其結(jié)果為:
t"+f(1,2));

函數(shù)的參數(shù)及調(diào)用

view plaincopy to clipboardprint?
<!--  
   /*  
       Function:函數(shù)在Javascript中的是一個非常重要的概念,  
       一般函數(shù)都是有返回值的,如果函數(shù)沒有返回值則默認情況下  
       返回的是undefined。  
       return 語句返回函數(shù)的值,也可以寫成"return ;"什么都不返回  
       定義:function 函數(shù)名(參數(shù)列表){}              
   */  
     
   function fun(a,b){  
       return a+b;  
   }  
     
   document.write("
函數(shù)fun(3)的返回值為:"+fun(3));  
   document.write("
函數(shù)fun(3,null)的返回值為:"+fun(3,null));  
   document.write("
函數(shù)fun(3,3,4)的返回值為:"+fun(3,3,4));  
   document.write("
函數(shù)fun(3,undefined)的返回值為:"+fun(3,undefined));  
     
     
   /* 沒顯式給出return語句,則函數(shù)返回undefined */  
   function fun2(){}  
   if(!fun2()){  
       alert("函數(shù)返回的是" + fun2());  
   }  
     
   /* 函數(shù)的缺省參數(shù) */  
   function fun3(a,b){  
       //給定參數(shù)a的缺省值為10  
       a = a || 10;  
       //給定參數(shù)b的缺省值為20  
       if(!b){  
           b = 20 ;  
       }  
         
       return a + b ;  
   }  
     
   /*  
       在Javascript中調(diào)用一個帶參函數(shù)時傳入的實參個數(shù)與定義的形參個數(shù)可以不  
       如果傳少,后面的自動為undefined  
       如果傳多,后面多余的自動截斷  
   */  
   document.write("
少傳參數(shù)的情況:fun3(8)"+fun3(8));  
   document.write("
多傳參數(shù)的情況:fun3(8,8,8)"+fun3(8,8,8));  
     
     
   /*  
       檢測函數(shù)的參數(shù)個數(shù) length,arguments  
       函數(shù)length的屬性返回的是函數(shù)的形參個數(shù)  
       函數(shù)arguments.length返回的是函數(shù)的實參個數(shù)  
   */  
   function fun4(a,b){  
       if(fun4.length!=arguments.length){  
           throw new Error("
參數(shù)不匹配,實參個數(shù)為:"+arguments.length+  
           ",形參的個數(shù)為:"+fun4.length);  
       }else  
       {  
           alert("傳入的參數(shù)與實參個數(shù)匹配");  
       }  
   }  
     
   try{  
       document.write("
調(diào)用函數(shù)形式為:fun4(8)"+fun4(8));  
   }catch(ex){  
       document.write("
調(diào)用函數(shù)時出錯了!"+ex.description);  
   }  
     
   fun4(8,8);  
     
   //接收任意參數(shù)的函數(shù)(通過arguments參數(shù))  
   function fun5(){  
       document.write("
函數(shù)調(diào)用的參數(shù)為:");  
       for(var i=0;i            document.write(" - " + arguments[i] + " - ");  
       }  
       document.write("
");  
   }  
     
   fun5(1,2,3);  
     
     
   /*  
       拋參數(shù)類型異常  
   */  
   function fun6(a,b){  
       if((typeof a) != "number" || (typeof b) != "number"){  
           throw new Error("參數(shù)的類型必須為數(shù)字");  
       }  
       return a + b ;  
   }  
     
   try{  
       fun6("aa");  
   }catch(ex){  
       document.write("
參數(shù)類型出錯了," + ex.description);  
   }      
// --&gt

<!--
/*
 Function:函數(shù)在Javascript中的是一個非常重要的概念,
 一般函數(shù)都是有返回值的,如果函數(shù)沒有返回值則默認情況下
 返回的是undefined。
 return 語句返回函數(shù)的值,也可以寫成"return ;"什么都不返回
 定義:function 函數(shù)名(參數(shù)列表){}    
*/

function fun(a,b){
 return a+b;
}

document.write("
函數(shù)fun(3)的返回值為:"+fun(3));
document.write("
函數(shù)fun(3,null)的返回值為:"+fun(3,null));
document.write("
函數(shù)fun(3,3,4)的返回值為:"+fun(3,3,4));
document.write("
函數(shù)fun(3,undefined)的返回值為:"+fun(3,undefined));


/* 沒顯式給出return語句,則函數(shù)返回undefined */
function fun2(){}
if(!fun2()){
 alert("函數(shù)返回的是" + fun2());
}

/* 函數(shù)的缺省參數(shù) */
function fun3(a,b){
 //給定參數(shù)a的缺省值為10
 a = a || 10;
 //給定參數(shù)b的缺省值為20
 if(!b){
  b = 20 ;
 }
 
 return a + b ;
}

/*
 在Javascript中調(diào)用一個帶參函數(shù)時傳入的實參個數(shù)與定義的形參個數(shù)可以不
 如果傳少,后面的自動為undefined
 如果傳多,后面多余的自動截斷
*/
document.write("
少傳參數(shù)的情況:fun3(8)"+fun3(8));
document.write("
多傳參數(shù)的情況:fun3(8,8,8)"+fun3(8,8,8));


/*
 檢測函數(shù)的參數(shù)個數(shù) length,arguments
 函數(shù)length的屬性返回的是函數(shù)的形參個數(shù)
 函數(shù)arguments.length返回的是函數(shù)的實參個數(shù)
*/
function fun4(a,b){
 if(fun4.length!=arguments.length){
  throw new Error("
參數(shù)不匹配,實參個數(shù)為:"+arguments.length+
  ",形參的個數(shù)為:"+fun4.length);
 }else
 {
  alert("傳入的參數(shù)與實參個數(shù)匹配");
 }
}

try{
 document.write("
調(diào)用函數(shù)形式為:fun4(8)"+fun4(8));
}catch(ex){
 document.write("
調(diào)用函數(shù)時出錯了!"+ex.description);
}

fun4(8,8);

//接收任意參數(shù)的函數(shù)(通過arguments參數(shù))
function fun5(){
 document.write("
函數(shù)調(diào)用的參數(shù)為:");
 for(var i=0;i   document.write(" - " + arguments[i] + " - ");
 }
 document.write("
");
}

fun5(1,2,3);


/*
 拋參數(shù)類型異常
*/
function fun6(a,b){
 if((typeof a) != "number" || (typeof b) != "number"){
  throw new Error("參數(shù)的類型必須為數(shù)字");
 }
 return a + b ;
}

try{
 fun6("aa");
}catch(ex){
 document.write("
參數(shù)類型出錯了," + ex.description);
}
// --&gt

函數(shù)Call的用法

view plaincopy to clipboardprint?
function fun(){                
   document.write("
調(diào)用者為:"+ this.toString() +" , 調(diào)用函數(shù)為fun()" );  
}  
 
//fun()的調(diào)用形式與fun.call(this)的調(diào)用形式一樣  
fun();            
fun.call(this);  
//用JS中的固定對象Math去執(zhí)行fun()方法  
fun.call(Math);    
     
//自定義一個對象  
var p = {  
   name : "自定義對象p",  
   //重寫Object對象的toString()方法  
   toString : function(){  
       return this.name;  
   }  
};  
//用自定義的對象去執(zhí)行fun()方法  
fun.call(p);  
 
 
//調(diào)用方法有參數(shù)時的call調(diào)用形式  
document.write("

");  
function fun2(str){  
   document.write("
調(diào)用方法有參數(shù)時的call調(diào)用形式 fun2.call(obj,args)");  
};  
fun2.call(this);  
 
 
//實例  
var fruit = {name:"蘋果",act:"吃的"};  
var book = {name:"電腦書",act:"讀的",play:function(){  
   document.write("
"+this.name+" 是用來 "+this.act+" !");  
}};  
book.play();  
book.play.call(fruit);  
book.play.call(Math);  
function fun(){    
document.write("
調(diào)用者為:"+ this.toString() +" , 調(diào)用函數(shù)為fun()" );
}

//fun()的調(diào)用形式與fun.call(this)的調(diào)用形式一樣
fun();  
fun.call(this);
//用JS中的固定對象Math去執(zhí)行fun()方法
fun.call(Math);

//自定義一個對象
var p = {
name : "自定義對象p",
//重寫Object對象的toString()方法
toString : function(){
 return this.name;
}
};
//用自定義的對象去執(zhí)行fun()方法
fun.call(p);


//調(diào)用方法有參數(shù)時的call調(diào)用形式
document.write("

");
function fun2(str){
document.write("
調(diào)用方法有參數(shù)時的call調(diào)用形式 fun2.call(obj,args)");
};
fun2.call(this);


//實例
var fruit = {name:"蘋果",act:"吃的"};
var book = {name:"電腦書",act:"讀的",play:function(){
document.write("
"+this.name+" 是用來 "+this.act+" !");
}};
book.play();
book.play.call(fruit);
book.play.call(Math);

函數(shù)的閉包

閉包 : closure 微軟在設計Ajax時就使用這種技術(shù)來模擬類
   很顯然,這種模型的類描述特別象C#語言的描述形式,在一個構(gòu)造函數(shù)里依次定義了私有成員、公共屬性和可用的方法,顯得非常
   優(yōu)雅嘛。特別是“閉包”機制可以模擬對私有成員的保護機制,做得非常漂亮。
   所謂的“閉包”,就是在構(gòu)造函數(shù)體內(nèi)定義另外的函數(shù)作為目標對象的方法函數(shù),而這個對象的方法函數(shù)反過來引用外層外層函數(shù)體中
   的臨時變量。這使得只要目標對象在生存期內(nèi)始終能保持其方法,就能間接保持原構(gòu)造函數(shù)體當時用到的臨時變量值。盡管最開始的構(gòu)
   造函數(shù)調(diào)用已經(jīng)結(jié)束,臨時變量的名稱也都消失了,但在目標對象的方法內(nèi)卻始終能引用到該變量的值,而且該值只能通這種方法來訪
   問。即使再次調(diào)用相同的構(gòu)造函數(shù),但只會生成新對象和方法,新的臨時變量只是對應新的值,和上次那次調(diào)用的是各自獨立的。的確
   很巧妙!但是前面我們說過,給每一個對象設置一份方法是一種很大的浪費。還有,“閉包”這種間接保持變量值的機制,往往會給JavaSript
   的垃圾回收器制造難題。特別是遇到對象間復雜的循環(huán)引用時,垃圾回收的判斷邏輯非常復雜。無獨有偶,IE 瀏覽器早期版本確實存在
   JavaSript 垃圾回收方面的內(nèi)存泄漏問題。再加上“閉包”模型在性能測試方面的表現(xiàn)不佳,微軟最終放棄了“閉包”模型,而改用“原型”
   模型。正所謂“有得必有失”嘛。
   普通函數(shù)在調(diào)用完后,如果沒有外部的引用就會被銷毀
   使用閉包結(jié)構(gòu)的函數(shù),則使閉包中的內(nèi)容有選擇的保留下來了

view plaincopy to clipboardprint?
<!--  
             
   function fun2(){  
       var x = 5 ;  
       return function(){  
           return x++ ;  
       }  
   }  
     
   pf(fun2()()); //這個代碼每執(zhí)行一次輸出不同的x的值  
     
   //使用閉包計算階乘  
   function fun(x){  
       return x > 1 ? x * arguments.callee(x-1) : 1 ;  
   }  
     
   pf("fun(1) : " + fun(1));  
   pf("fun(2) : " + fun(2));  
   pf("fun(3) : " + fun(3));  
   pf("

");  
     
   //我們說匿名函數(shù)調(diào)用產(chǎn)生一個"瞬時"的閉包  
   //因此當調(diào)用結(jié)束后,私有變量無法訪問,并且如果沒有外部引用存在  
   //內(nèi)部對象就會被銷毀  
   //而如果返回了函數(shù),或者被全局引用,則"閉包"被保留了下來  
   //閉包中的內(nèi)容被"有選擇"地開放出來  
   (function(){  
       //封閉的私有域  
       var innerX = 10 ;  
       var innerY = 20 ;  
         
       //開放的公共域  
       outerObj = {x:innerX,y:innerY};  
   })();  
   try{  
       pf(innerX); //內(nèi)部數(shù)據(jù)無法訪問  
   }catch(ex){  
       pf("內(nèi)部數(shù)據(jù)無法訪問" + ex.description);  
   }  
   pf(outerObj.x);  //通過外部接口訪問  
     
   function pf(str){  
       document.write("
"+str);  
   }  
     
     
   //閉包改變外部環(huán)境  
   //定義一個計數(shù)器生成函數(shù),生成某種類型的計數(shù)器  
   function counter(iden, addi)  
   {  
       //閉包"外部",函數(shù)counter"內(nèi)部"的參數(shù)iden的值在閉包被調(diào)用的時候會被改變  
       return function(){  
           //改變iden的值  
           iden = iden+addi;  
           return iden;  
       }  
   }  
   //產(chǎn)程一個從0開始計數(shù),每次計數(shù)值加1的計數(shù)器  
   var c1 = counter(0, 1);    
   //產(chǎn)生一個從10開始計數(shù),每次計數(shù)值減1的計數(shù)器  
   var c2 = counter(10, -1);  
   for(var i = 0; i < 10; i++){  
       //循環(huán)計數(shù)  
       c1();  
   }  
   for(var i = 0; i < 10; i++){  
       //循環(huán)計數(shù)  
       c2();  
   }  
     
   //閉包和面向?qū)ο? 
   //定義一個Foo類型  
   function Foo(a)  
   {  
       function _pC()  //私有的函數(shù)  
       {  
           return a;  
       }  
       //公有的函數(shù),通過它產(chǎn)生的閉包可以訪問對象內(nèi)部的私有方法_pC()  
       this.bar = function(){        
           dwn("foo" + _pC() + "!");  
       }  
   }  
   var obj = new Foo("bar");  
   obj.bar(); //顯示Foo bar!  
     
   //閉包的其它形式  
   //測試函數(shù),異步計數(shù)  
   function test()  
   {  
       for (var i = 0; i < 5; i++)  
       {  
           //如果沒有這個閉包,不能正確得到0,1,2,3,4的結(jié)果  
           //因為setTimeout是在循環(huán)結(jié)束后才被"異步"調(diào)用的  
           (function(j){  
               setTimeout(function(){alert(j)}, 100);  
           })(i);  
       }  
   }  
   test();  
     
   //私有域  
   var a,b;  
   (function(){  
       //(function(){……})();的寫法利用閉包構(gòu)成了一個私有域  
       //它將私有屬性a、b同外界隔離開來  
       //這種用法在高級的JavaScript程序設計中會經(jīng)常見到  
         
       //查看閉包內(nèi)的a、b的值  
       showAB = function()  
       {  
           dwn(a);  
           dwn(b);  
       }  
       var a = 10;  
       var b = 20;  
   })();          
   a = -10;  
   b = -20;    //外部改寫的a、b  
   dwn(a);  
   dwn(b);  
   showAB();   //不會破壞showAB()得到的內(nèi)部的a、b的值  
     
   //函數(shù)的執(zhí)行域  
   //產(chǎn)生隨機數(shù)的函數(shù)  
   function RandomAlert()  
   {  
       var x = Math.random()  
       return function()  
       {  
           alert(x);  
       }  
   }  
   var a = RandomAlert();    
   //閉包的執(zhí)行域隨函數(shù)調(diào)用而創(chuàng)建  
   var b = RandomAlert();  
   a();    //調(diào)用a,打印出產(chǎn)生的隨機數(shù)  
   b();    //調(diào)用b,打印出產(chǎn)生的隨機數(shù)  
// --&gt

<!--
 
function fun2(){
 var x = 5 ;
 return function(){
  return x++ ;
 }
}

pf(fun2()()); //這個代碼每執(zhí)行一次輸出不同的x的值

//使用閉包計算階乘
function fun(x){
 return x > 1 ? x * arguments.callee(x-1) : 1 ;
}

pf("fun(1) : " + fun(1));
pf("fun(2) : " + fun(2));
pf("fun(3) : " + fun(3));
pf("

");

//我們說匿名函數(shù)調(diào)用產(chǎn)生一個"瞬時"的閉包
//因此當調(diào)用結(jié)束后,私有變量無法訪問,并且如果沒有外部引用存在
//內(nèi)部對象就會被銷毀
//而如果返回了函數(shù),或者被全局引用,則"閉包"被保留了下來
//閉包中的內(nèi)容被"有選擇"地開放出來
(function(){
 //封閉的私有域
 var innerX = 10 ;
 var innerY = 20 ;
 
 //開放的公共域
 outerObj = {x:innerX,y:innerY};
})();
try{
 pf(innerX); //內(nèi)部數(shù)據(jù)無法訪問
}catch(ex){
 pf("內(nèi)部數(shù)據(jù)無法訪問" + ex.description);
}
pf(outerObj.x);  //通過外部接口訪問

function pf(str){
 document.write("
"+str);
}


//閉包改變外部環(huán)境
//定義一個計數(shù)器生成函數(shù),生成某種類型的計數(shù)器
function counter(iden, addi)
{
 //閉包"外部",函數(shù)counter"內(nèi)部"的參數(shù)iden的值在閉包被調(diào)用的時候會被改變
 return function(){
  //改變iden的值
  iden = iden+addi;
  return iden;
 }
}
//產(chǎn)程一個從0開始計數(shù),每次計數(shù)值加1的計數(shù)器
var c1 = counter(0, 1);
//產(chǎn)生一個從10開始計數(shù),每次計數(shù)值減1的計數(shù)器
var c2 = counter(10, -1);
for(var i = 0; i < 10; i++){
 //循環(huán)計數(shù)
 c1();
}
for(var i = 0; i < 10; i++){
 //循環(huán)計數(shù)
 c2();
}

//閉包和面向?qū)ο?br/> //定義一個Foo類型
function Foo(a)
{
 function _pC()  //私有的函數(shù)
 {
  return a;
 }
 //公有的函數(shù),通過它產(chǎn)生的閉包可以訪問對象內(nèi)部的私有方法_pC()
 this.bar = function(){  
  dwn("foo" + _pC() + "!");
 }
}
var obj = new Foo("bar");
obj.bar(); //顯示Foo bar!

//閉包的其它形式
//測試函數(shù),異步計數(shù)
function test()
{
    for (var i = 0; i < 5; i++)
    {
  //如果沒有這個閉包,不能正確得到0,1,2,3,4的結(jié)果
  //因為setTimeout是在循環(huán)結(jié)束后才被"異步"調(diào)用的
        (function(j){
            setTimeout(function(){alert(j)}, 100);
        })(i);
    }
}
test();

//私有域
var a,b;
(function(){
 //(function(){……})();的寫法利用閉包構(gòu)成了一個私有域
 //它將私有屬性a、b同外界隔離開來
 //這種用法在高級的JavaScript程序設計中會經(jīng)常見到
 
 //查看閉包內(nèi)的a、b的值
 showAB = function()
 {
  dwn(a);
  dwn(b);
 }
 var a = 10;
 var b = 20;
})();  
a = -10;
b = -20; //外部改寫的a、b
dwn(a);
dwn(b);
showAB(); //不會破壞showAB()得到的內(nèi)部的a、b的值

//函數(shù)的執(zhí)行域
//產(chǎn)生隨機數(shù)的函數(shù)
function RandomAlert()
{
 var x = Math.random()
 return function()
 {
  alert(x);
 }
}
var a = RandomAlert();
//閉包的執(zhí)行域隨函數(shù)調(diào)用而創(chuàng)建
var b = RandomAlert();
a(); //調(diào)用a,打印出產(chǎn)生的隨機數(shù)
b(); //調(diào)用b,打印出產(chǎn)生的隨機數(shù)
// --&gt

全局函數(shù)

未與任何函數(shù)關(guān)聯(lián)的函數(shù)    
    decodeURI(URIstring):返回一個已編碼的統(tǒng)一資源標識符 (URI) 的非編碼形式。 必要的 URIstring 參數(shù)代表一個已編碼 URI 的值。    
    encodeURI(URIString):將文本字符串編碼為一個有效的統(tǒng)一資源標識符 (URI)。encodeURI 方法不會對下列字符進行編碼:":"、"/"、";" 和 "?"。    
    isNaN(numValue):數(shù)值判斷函數(shù) ,如果值是 NaN, 那么 isNaN 函數(shù)返回 true ,否則返回 false 。     *
    parseInt(numString, [radix]):將不同進制的數(shù)值轉(zhuǎn)換成十進制,底數(shù)radix可選。    
    parseFloat(numString):返回由字符串轉(zhuǎn)換得到的浮點數(shù)。    
    eval(codeString):檢查 JScript 代碼并執(zhí)行.eval 函數(shù)允許 JScript 源代碼的動態(tài)執(zhí)行。

view plaincopy to clipboardprint?
//對url地址進行編碼  
var url1 = "http://www.csdn.net/ppjava2009/note.aspx?name='函數(shù)原形'";            
pf("encodeURI編碼前為:"+url1+" , 編碼后為:"+encodeURI(url1));  
pf("decodeURI解碼前為:"+encodeURI(url1)+" , 編碼后為:"+decodeURI(encodeURI(url1)));  
 
//判斷非數(shù)值isNaN,如果值是NaN則返回true,否則返回false  
var s1 = "123abc";  
var s2 = "123";  
var s3 = 30;  
var s4 = new Number("8");  
pf(isNaN(s1));  //打印true  
pf(isNaN(s2));  //打印false  
pf(isNaN(s3));  //打印false  
pf(isNaN(s4));  //打印false  
 
 
//數(shù)值轉(zhuǎn)化 parseInt(str)和parseFloat(str)  
var n1 = "123abc5";  
var n2 = "abc";  
var n3 = "123.5d4";  
pf(parseInt(n1));   //打印123,數(shù)值轉(zhuǎn)換時遇到字母、小數(shù)點以及其它字符就停止  
pf(parseInt(n2));   //打印NaN 轉(zhuǎn)換沒有報異常  
pf(parseInt(n3));   //打印123  
 
var n4 = "123.5d4";  
var n5 = "0.884";  
pf(parseFloat(n4)); //打印123.5  
pf(parseFloat(n5)); //打印0.884  
 
//eval編譯器  
var str = "alert('hello eval')";  
eval(str);  //彈出"hello eval"  
 
                         
 
function pf(str){  
   document.write("
"+str);  
}  
//對url地址進行編碼
var url1 = "http://www.csdn.net/ppjava2009/note.aspx?name='函數(shù)原形'";  
pf("encodeURI編碼前為:"+url1+" , 編碼后為:"+encodeURI(url1));
pf("decodeURI解碼前為:"+encodeURI(url1)+" , 編碼后為:"+decodeURI(encodeURI(url1)));

//判斷非數(shù)值isNaN,如果值是NaN則返回true,否則返回false
var s1 = "123abc";
var s2 = "123";
var s3 = 30;
var s4 = new Number("8");
pf(isNaN(s1)); //打印true
pf(isNaN(s2)); //打印false
pf(isNaN(s3)); //打印false
pf(isNaN(s4)); //打印false


//數(shù)值轉(zhuǎn)化 parseInt(str)和parseFloat(str)
var n1 = "123abc5";
var n2 = "abc";
var n3 = "123.5d4";
pf(parseInt(n1)); //打印123,數(shù)值轉(zhuǎn)換時遇到字母、小數(shù)點以及其它字符就停止
pf(parseInt(n2)); //打印NaN 轉(zhuǎn)換沒有報異常
pf(parseInt(n3)); //打印123

var n4 = "123.5d4";
var n5 = "0.884";
pf(parseFloat(n4)); //打印123.5
pf(parseFloat(n5)); //打印0.884

//eval編譯器
var str = "alert('hello eval')";
eval(str); //彈出"hello eval"

function pf(str){
document.write("
"+str);
}

感謝你能夠認真閱讀完這篇文章,希望小編分享的“函數(shù)Function怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI