JS函数

来源:互联网 发布:游戏美工培训学费 编辑:程序博客网 时间:2024/05/19 13:56

JS函数基础

0.目前掌握的情况:

声明:function xxx(){}      或匿名element.onXXX()=function(){}调用:函数名传参问题:     作用域     函数执行原理过程……新问题:     构造函数     函数式编程

1. 定义

1.1 function functionName(parameter1,parameter2,……){}1.2 return:函数停止执行,返回表达式的值(默认是undefined)1.3 嵌套函数:function test(a,b){   function square(x){       return x*x;   }   return Math.sqrt(square(a)+square(b));}/*内部函数square()可以访问外部函数的变量*/不严格规范:01 函数声明语句不能出现在循环、条件或try/cache/finally以及with语句中02 函数表达式语句可以出现在js代码的任意位置

2. 调用

四种方式:   作为函数|方法|构造函数|通过他们的方法:call()、apply()间接调用
2.1 函数调用:
   不理解:   如果该函数返回是因为解释器到达结尾,返回值就是undefined;   根据ECMScript5,调用上下文(this的值)是全局对象   通过this判断当前是否是严格模式?   http://www.cnblogs.com/ouyangping/p/6445877.html
strict pattern(严格模式):<script type="text/javascript">            "use strict";//使用严格模式的语法            var strict = (function(){                return !this;//此时为true            }());            console.log(strict);        </script>
2.2 方法调用:
  将函数定义为对象的方法  eg. o.m = f;      调用:o.m();            o["m"](x,y)//x,y是函数m的参数  与函数调用的区别:     调用上下文:对象o,函数体可以使用this引用该对象
<script type="text/javascript">    "use strict"    var calculator = {        op1 : 1,        op2 : 2,        add : function(){            this.result = this.op1+this.op2;            //直接给对象增加属性result            }        };        calculator.add();        console.log(calculator.result);</script>
2.3 构造函数调用:
2.4 间接调用:
call()apply()

3. 实参和形参

3.1 可选形参:
   实参比形参个数少时,形参默认值是undefined
赋合理值:if(a === undefined) a=[];or:a=a||[];//前提是a要被预先声明注:可选参数函数请加注释:function getProperties(o,/*optional*/a){}//其中a表示可选参数
3.2 可变长的实参列表:
这种情况是实参个数大于形参个数针对此,js默认行为是省略    实参对象引用:arguments,类数组对象应用: 01 检验实参个数——arguments.length;     02 实现接受任意实参的函数——不定实参函数(不定个数|值|顺序),==此时实参个数不可以为零==callee:指代当前正在执行的函数caller:指代调用callee的函数
callee:用于匿名函数的递归调用var factorial = function(x){    if(x <= 1)return 1;    return x*arguments.callee(x-1);}/*将对象属性作为实参*/            function arr(/*array*/from1,/*index*/from_start,/*array*/to,/*index*/to_start,/*integer*/length){                console.log(from1)            }            function easycopy(args){                arr(args.from1,args.from_start||0,                    args.to,args.to_start||0,args.length);            }            var a=[1,2,3,4];            var b=[];            easycopy({from1:a,to:b,length:4});

注:所有的原始类型都能转化为String;
所有的对象都包含toString();
写代码时最好加上实参类型检查。
p177

4. 值和命名空间

4.1作为值的函数
      自定义函数属性:      functionName.property = value;
4.2作为命名空间的函数
     定义函数并立即调用:     (function(){}());

5.闭包

   作用域链:变量查找的范围,从包含自己的函数开始不断向外层作用域查找   闭包:函数变量可以被隐藏在作用域链之内   http://blog.csdn.net/yueguanghaidao/article/details/9568071
var scope="global";  function t(){      console.log(scope);      //<==>var scope;    //    console.log(scope);    //函数体内的声明会覆盖全局变量,out="undefined"    var scope="local"      console.log(scope);  }  t();
<html>  <head>  <script type="text/javascript">  function buttonInit(){      for(var i=1;i<4;i++){          var b=document.getElementById("button"+i);         console.log(i);//1,2,3        b.addEventListener("click",function(){ alert("button"+i);},false);      }      console.log(i);//4}  i=5;console.log(i);window.onload=buttonInit;  </script>  </head>  <body>  <button id="button1">Button1</button>  <button id="button2">Button2</button>  <button id="button3">Button3</button>  </body>  </html>  
利用闭包实现的私有属性存取器方法<script type="text/javascript">            function addPrivateProperty(o,name,/*验证函数*/predicate){                var value;//属性值                //属性的getter()                /*!!两个闭包共享变量value!!*/                o["get"+name] = function(){                    return value;                    console.log("getName="+value);                };                o["set"+name] = function(v){                    if(predicate&&!predicate(v))                        throw Error("set"+name+":invalid value "+v);                    else{                        value = v;                        console.log("setName="+value);                    }                };            }            var o = {};//定义一个空对象            addPrivateProperty(o,"Name",function(x){                return typeof x == "string";            });            o.setName("Frank");            console.log(o.getName());//Frank//          o.Name="Hello"            console.log("o.Name="+o.Name);//undefined,不可以直接获取//          o.setName(0);</script>

关联到闭包的作用域链都是”活动的”

with语句:
wait a minute!

6.属性、方法

 属性:     length:arguments.length             函数名.length:形参个数     prototype     call(): 语法:调用的函数.call(对象引用,参数1,参数2,……)     apply():     语法:调用的函数.apply(对象引用,[参数1,参数2,……])

泛函:一种变换——将函数转换为另一种函数或值

原创粉丝点击