JS: function:函数

函数创建:

创建一个函数可以执行多次,一般情况下每次执行函数和上次执行没有任何关系

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();  
原文地址:https://www.cnblogs.com/zzzzzzzsy/p/6596457.html