函数(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。