函数创建:
创建一个函数可以执行多次,一般情况下每次执行函数和上次执行没有任何关系
function sun(){
var total=null;
total=1+1;
return total;
}
函数创建后:
1、首先开辟一个新的内存空间,浏览器为其分配一个16进制的地址,假设地址为 c2x231o
2、把行数体中的js代码当作字符串存储岛内存空间中
3、再把这个地址赋值给当前的函数名sum
sum后面不加小括号,代表的就是当前函数本身
sum();sum后面加小括号,代表的是执行当前函数
sum():函数执行的目的:把函数之前存储的那些字符串变为js代码,然后再让js代码从上到下依次的执行
1)函数执行的时候,首先会提供一个供函数体中代码执行的环境
——》私有作用域
2)把函数体中的代码字符串变为代码从上到下执行
闭包:函数执行的时候,首先会形成一个新的私有作用域,供函数体中的代码从上到下执行;
形成的那个私有作用域,把我们函数体中的代码都包起来了,保护了里面的私有变量不受外界
干扰(外面获取不到也修改不了)-->我们把函数执行的时候形成的这种保护机制叫做"闭包";
函数的形参: 类似于函数的入口
如果定义了形参,如果没有传递值,默认形参的值是undefined
return: return就是当前函数提供给我们的出口,因为不提供出口的话,闭包的机制导致了在函数体的外面无法获取里面的返回值
如果想在外面得到返回值,只需通过return把返回值返回给外面即可-->返回机制
外面想用哪个值我们就把哪个值返回
并不是把变量返回给外面,而是把变量存储的值返回给外面
arguments:函数自带的(不管写没写形参,也不管是否传递值,arguments始终都是存在的),用来接受函数传递进来的参数值的一个集合
for(var i = 0;i<argments.length;i++){
var total = null;
var cur=arguments[i];
!isNaN(cur) ? total+=cur : total;
}
实名函数:起了名字的函数就是实名函数
匿名函数:没有起名字的函数就是匿名函数
自执行函数:定义函数和函数执行一起完成了
(fucntion(num){
})(100);
匿名函数
(function(){
var a="b";
alert(a);
})();
函数表达式: oDiv.onclick=function(){
}
/*
* length 形参个数
* name 函数名
* prototype 保存的是类的原型
* __proto__ 指向类的原型 也就是指针指向 prototype
*/
// 函数的三面性
// 1、普通函数方法 函数执行时候开辟栈内存作用域,形成闭包,进行预解释
// 2、类 他可以创建自己的实例,也可以在prototype属性上保存自己的属性和方法
// 3、普通对象 想object一样,拥有引用空间堆内存,也有__proto__找到自己所属类原型
3. caller
在一个函数调用另一个函数时,被调用函数会自动生成一个caller属性,指向调用它的函数对象。如果该函数当前未被调用,或并非被其他函数调用,则caller为null。
function testCaller() { var caller = testCaller.caller; alert(caller); } function aCaller() { testCaller(); } aCaller();
4. callee
当函数被调用时,它的arguments.callee对象就会指向自身,也就是一个对自己的引用。
由于arguments在函数被调用时才有效,因此arguments.callee在函数未调用时是不存在的(即null.callee),且解引用它会产生异常。
function aCallee(arg) { alert(arguments.callee); } function aCaller(arg1, arg2) {aCallee();} aCaller();