//匿名函数
var test1=function(x,y){return x*y;};
alert(test1(5,4));
var test2=test;
alert(test2(5,4));


//回调函数,函数传到另外一个函数中,test1、test2是回调函数
function calc(x,y){
    return x()+y();
}
function test1(){
    return 3;
}
function test2(){
    return 5;
}

alert(calc(test1,test2))


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

//回调函数,函数传到另外一个函数中,addOne是回调函数
function calcNum(a,b,c,callback){
    var i,arr=[];
    for(var i=0;i<3;i++){
        arr[i]=callback(arguments[i]*2);
    }
    return arr;
}

alert(calcNum(5,6,7,addOne));


//匿名回调函数方式
alert(test(5,6,7,function(a){return a+1}))


function test1(a,b){
    return a*b;
}

//call方式回调函数
alert(test1.call(test1,5,10));

//apply方式回调函数
var params=[3,4];
alert(test1.apply(test1,params));


//自带函数,不会发生任何全局变量,只会执行一次,适合初始化义务
(
function(){
    alert('abc');
}
)();


(
function(a,b){
    alert(a+b);
}
)(3,5);


//内部(私有)函数:在外层可以直接挪用a函数,然则挪用不了b函数。这种函数可以封装一些不让外部看到的函数。
function a(param){
    function b(param1){
        return param1+10;
    };
    return '在a函数体内条用b函数的效果为: ' +b(param);
}
document.write(a(5));


function a(param){
    var b=function(param1)
    return param1+10;
    };
    return '在a函数体内挪用b的效果' +b(param);
}
document.write(a(5));


//返回函数的函数:弹出aaa和bbb框
function a(){
    alert('aaa');
    return function(){
        alert('bbb');
    };
}
var func=a();
func();
或者
a()()


//重写自己的函数:弹出aaa和bbb框
function a(){
    alert('aaa');
    a=function(){
        alert('bbb');
    };
}
a();
a();


var a=function(){
    function setUp(){
        var setup='doSomeThing';
    }
    function doWhat{
        alert('要执行的操作');
    }
    setUp();
    return doWhat; //返回引用,不执行
}(); //自挪用

a(); //会弹出"要执行的操作"