Javascript知识点总结(六)

函数(Function)

函数在一般来说是用来描述事物之间关系的,而在Javascript更倾向于一种功能性质,这种功能性其实也就是复杂的实物关系。

  • 函数表达式标准格式及调用
    function name(){
    }

    name();

    特别来说:如果函数在声明后需要立即执行那么可以简写为
    (function(){

    })();这种形式,被小括号包含在一起的可以认为是一个整体,然后立即被调用。

  • 函数声明语句标准格式
    var name = function(){
    };

  • 函数调用
    1、直接调用
    通过小括号的形式

function test(){
    console.info("hello,world");
}

test();

2、在html中有一种称为事件调用,需要人工干预

<input type="button" name="提交" id="btn"/>
<script>
    var oBtn = document.getElementById('btn');
    function btnClick(){
        console.info('hello,world');
    }
    oBtn.onclick = btnClick;
script>

3、call和apply 被动调用,需要调用对象。

xx.call(对象,参数1,参数2…)
xx.apply(对象,[参数1,参数2…])

    function test(){
        console.info('hello,world');
    }
    test.call();
  • 参数

参数可以是固定参数和可变参数,函数中arguments表示函数参数集合,这个arguments类似于一个数组,并且有length属性,表示参数的长度

参数形式一:
function test(a){
    console.info(a);=>1
    a = 5;
}
var a = 1;
test(a);
console.info(a); =>1
参数形式二:
function test(arr){
    console.info(arr); =>[1,2,3,4]
    arr[0] = 5;
}
var arr = [1,2,3,4];
test(arr);
console.info(arr);=>[5,2,3,4]

参数形式三:
function test(x,y){
    console.info(arguments.length);
}
test(1,2);

上述例子中涉及到了深拷贝和浅拷贝问题,深拷是值和地址与原来的都不同,浅拷贝则只拷贝值得部分,一般引用类型就会涉及到这中问题。

  • callee和caller属性
    callee用于指代当前正在执行的函数,caller是非标准的,用于指代
    当前正在执行的函数的函数。
function factorial(x){
    if(x < 1)return 1;
    return x * arguments.callee(x-1);
}

callee代表当前这个factorial
caller代表当前递归factorial的上一层
  • 闭包
    函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称为闭包。在我看来闭包就是讲函数本身作为返回值,返回给全局等,来延长了函数的存活时间。个人认为这种延长方式是通过栈方式实现的,根据栈的特性先进后出,那么外层函数先进入栈中,而后其内部函数在栈顶,从而使外部函数的存活时间加长。相对于内部函数来说外层函数中的变量就是一个全局变量。
function test(){
    var a = 5;
    return function(){
        return a ;
    }
}

console.info(test()()) =>5

闭包这种内嵌函数形式,按照Java语言来说,可以模拟Java封装特性,只是模拟而已。

  • 总结
    其实说白了,函数的名字被标记为这个函数内存地址,通过这个名字搜寻到函数地址,加上小括号进行调用操作。而这种声明形式目的就是把匿名函数的地址存储到变量名中,从而不需要立即执行。函数中的变量都是局部变量,那么通过函数就可以隐藏参数的值(必须被var修饰,否则系统认为函数内部变量也是全变量,如果函数中不加var声明变量是一种不标准的书写方式),而函数之外的变量称为全局变量,可以被全局访问。另外在Javascript中如果没有return语句作为函数结束标识,那么该函数将返回undefined。

你可能感兴趣的:(javascript)