函数:用来存储代码块,可以封装多条重复操作,可以在任意位置直接调用执行

使用函数的步骤:声明、调用
声明:
    function 函数名(参数1,参数2,...,参数n){ 函数体 }
    注意:函数必须使用function关键字定义,一般情况下函数在没有调用的时候不会执行;函数在声明的时候,function后面圆括号()和大括号{}必不可少
调用:
    普通函数调用:函数名()
    事件调用: 函数名后面不加圆括号
函数表达式:函数名称可以省略,执行时只有执行到某一句时,才会对其进行解析

//    sum();
    function sum(){
        var a = 1;
        var b = 2;
        alert(a+b);
    }

    oBtn.onclick = sum;
    oBtn2.onclick = function(){//匿名函数:给特定的事件或变量使用,没有函数名
        alert(5);
    };
//    a();//报错 a is not a function
    var a = function fn(){
        alert('fn');
    };
    a();

函数的参数:

形参:形式参数,调用函数时进行的参数传递;如果函数在调用时,没有传参,那么参数值为undefined
实参:实际参数

函数特点:具有封装性,能够重复调用

封装性:想要实现某种功能,可以把核心代码整理出来,放在函数中,方便以后调用;调用时不必关心函数中的代码,只需要关心如何调用就可以了
封装步骤:1)提出需求 2)实现核心代码  3)向函数中传入不同的参数实现封装

函数的参数写在函数名后面的圆括号中,如果函数中有多个参数,每个参数之间用逗号隔开
参数的类型:可以是任意数据类型,但是使用null和undefined作为参数没有意义,有时还会报错,因此不建议使用

arguments:可以用来检测函数参数的个数——表示当前函数的所有实参的集合

函数的重名问题:

*   声明函数时,如果两个函数名称一致,后面的函数会覆盖前面的函数;函数名不要和变量名重名(报错信息:fn is not a function)

函数的作用域:指代了他们在什么样的上下文中执行

js解析器:浏览器中用来执行js程序
    1)找内容(根据关键词:var function 参数)
        a = undefined;---> a = 1;//所有变量在正式运行之前,都会提前赋一个值为未定义
        fn = function fn(){ console.log(a);}//所有的函数在正式运行之前,都是一个整的代码块
        这个过程叫js预解析
    2)逐行解析代码
        正式读代码时,会先从之前解析的库中查找,看到的第18行代码会显示undefined;
        执行到第19行代码时,会修改库中的解析值,将a的值1;
var a = 1; //全局变量:直接在script标签下,函数外部声明的变量
        function fn() {
            alert(a);  //undefined 
            var a = 2; //局部变量:函数内部定义的,只能在函数内部访问   
        }
        fn();
        alert(a); //1

    function fn(){
        var a = 1;//局部
        b = 2;//全局,声明变量时,省略var创建的是一个全局变量。函数内部可以访问到外面的全局变量和全局函数,是 
  因为有作用链——向上层查找
    }
    fn();
//    alert(a);//报错 a is not defined
    alert(b);//2

DOM标准中提供了一个获取当前对象样式的全局方法:

*   getComputedStyle(obj).width 获取元素obj的宽度

在IE中有自己的获取DOM元素属性的方法:

*   obj.currentStyle.width
function getStyle(obj,attr){
    if(window.getComputedStyle){
        return getComputedStyle(obj)[attr];
    }else{
        return obj.currentStyle[attr];
    }
  }

</scrip