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;

      }

 }

})()

猜你喜欢

转载自blog.csdn.net/wenmin1987/article/details/83688653