1. 程式人生 > >javascript--函式基礎(函式的定義/作用域,回撥函式,即時函式,內部(私有)函式,返回函式的函式,重寫自己的函式)

javascript--函式基礎(函式的定義/作用域,回撥函式,即時函式,內部(私有)函式,返回函式的函式,重寫自己的函式)

函式源於數學對映運算,它定義了一種關係,這種關係使一個集合裡的每一個元素對應到另一個(可能相同的)集合裡的唯一元素

javascript中:

函式是程式碼塊,一段被封閉嚴實的程式碼塊

函式是資料:使用者可以把函式作為 值 賦值給 變數

函式是一種物件,它是一類抽象類(建構函式),所有物件都是通過型別構造而來var a=new Array()  var  f=new Function();

 

一  :定義函式的3中方法:(函式若沒有return則預設返回undefined)

----function語句:具有函式作用域(命令的形式  靜態 構造

一個函式

     function() f(x){return x} 

----Function建構函式:(頂級函式)具有頂級作用域(解析函式體,動態 建立一個函式物件)

    var f=new Function("x","return x")

---函式直接量:具有函式作用域(以表示式的形式  靜態 建立一個函式)

    var f=function(x){return x}

舉例:以下等價

var f=new Function("a,b,c","return a+b+c")  

var f=new Function("a","b","c","return a+b+c")

 var f=new Function("a,b","c","return a+b+c")

           function f(a,b,c){ return a+b+c}

        var f=function(a,b,c){return a+b+c}

2理解 頂級作用域區域性作用域

var n=1;

function f(){

    var n=2;

    function e(){

         return n;

     }

   return e;

}

alert(f()());//2

---------------------------------------------------------------

var n=1;

function f(){

    var n=2;

  var e=function(){

         return n;

     }

   return e;

}

alert(f()());//2 普通函式作用域

-----------------------------------------------------------

var n=1;

function f(){

    var n=2;

    var e= new Function("return n;")

   return e;

}

alert(f()());//1  頂級函式作用域

二. 預定義函式

javascript提供的可供隨時呼叫的內建函式

  parseInt()  parseFloat()  isNaN() isFinite()

  encodeURI(url)    decodeURI()

  encodeURIComponent(url)    decodeURIComponent()

  eval()

 alert()--這個是宿主環境-瀏覽器提供

三:回撥函式

當我們將函式A傳遞給函式B,並由B來執行A時,A就成了一個 回撥函式 (callback functions),若果這時A還是一個匿名函式,則稱為匿名回撥函式

function multiplayByTwo(a,b,c){

 var i,ar=[];

       for(i=0;i<3;i++){

         ar[i]=argment[i]*2;

      }

return ar;

}

funtion addOne(a){return a+1;}

multiplayByTwo(1,2,3);//[2,4,6]

addOne(100);//[101]

var myarr=[];

myarr=mulplayByTwo(10,20,30);//[20,40,60]

for(var i=0;i<3;i++){

    myarr[i]=addOne(myarr[i])

}

myarr //[21,41,61]

修改成回撥函式:

funtion addOne(a){return a+1;}

function multplayByTwo(a,b,c,callback){//使用回撥函式callback

    var i,ar=[];

   for(i=0;i<3;i++){

    ar[i]=callback(arguments[i]*2);

   }

  return ar;

}

myarr=multplayByTwo(1,2,3,addone)

multplayByTwo(1,2,3,function(){//簡化,使用匿名函式 直接代替addone()

  return a+1;

})

四、即時函式

(function(name){alert('hello'+name)})('Owen')// hello Owen

var result=(function(){... ;return someting}())

var result=function(){... ;return someting}()//可讀性比上一句差了點,不讀到最後不知道result到底是一個函式還是一個即時函式的返回值

五、內部(私有)函式

function outer(param){

      function inner(theinput){

       return theinput*2;

    }

   return 'the result is'+inner(param);

}

var outer=function(param){

      var inner=function(theinput){

       return theinput*2;

    }

   return 'the result is'+inner(param);

}

 

outer(2)//'the result is 4'

inner(2)//報錯, 這是個私有函式,外部不能呼叫

 

六、返回函式的函式

function a(){

     alert('A!');

   return function(){

      alert('B!');

   }

}

var  newF=a();//A!

newF();//B!

七、能重寫自己的函式

function a(){

     alert('A!');

  a=function(){

      alert('B!');

   }

}

八、閉包(getter ,setter ,迭代器(next()))

利用閉包實現迭代器

function setup( ){

  var i=0;

  return function(){

   return x[i++]

  }

  }

var next=setup(['a','b','c','d']);

next();//a

next();//b

next();//c

利用閉包getter setter

var getValue,setValue;

(funciton(){

   var secret=0;

   getValue=function(){

    return secret;

   }

setValue=funciton(v){

   if(typeof v==='number'){

       secret = v;

      }

 }

})()