5、函数
一、函数的概念
//函数是引用数据类型 操作的是空间地址 // function 函数名(形参){ // 函数体:实现这个方法的js代码 // }; // 函数名(实参) //执行函数 // 求和的函数 function sum(){ var total=null; total=1+1; console.log(total) //函数定义的时候,没有任何意义 输出无结果,相当于封装了一个方法。 // 相当于以一堆字符串的形式存储到一个浏览器开辟的虚拟空间, // 并给这个空间分配一个十六进制的地址,最后将这个地址存储到这个函数名,//(全局作用域:代码加载完成) // 函数执行的时候,才会将空间内函数体的字符串转为js代码,从上到下执行(再开辟一个小的虚拟空间) //(私有作用域:执行函数的时候) }; sum(); //函数执行的时候,函数才有意义,形成一个私有作用域, 里面的变量 值等,外界无法访问修改,我们把这种机制叫做闭包。 sum(); //sum 就代表这个函数本身,加上()后就是执行这个函数
二、形参
// 形参 function sum(a,b) { //逗号隔开 var total = null; total = a + b; console.log(total) console.log(b) }; sum(1,3); //函数执行的时候,上面的console.log 才会输出 sum(100); // 只写一个数的时候,没有给形参b 具体的值,默认为undefined 最后是 100+undefined 会输出NaN
三、返回值
// function sum(a,b) { //逗号隔开 // var total = null; // total = a + b; // return total; //这个函数的返回值 // }; // console.log(sum(2,3)) // console.log(total) //没有return 私有域(函数体)里面的东西外面无法获取 // sum(1,3); // sum(100);// 函数中遇到return 后面的代码不执行 // return 后面可以加个变量 返回值 // 函数没有返回值 输出就是undefined 有返回值就可以输出返回值了 function sum(num1,num2){ var total=null; total=num1+num2; console.log(total); // return total; //return 就是当前函数提供的出口,闭包的机制,函数体外面无法获取里面total的值,如果外面想用里面的total的值,需要通过return 把total的值返回给外面即可-->返回值机制 // 外面想用哪个值,就把哪个值返回,-->return total。并不是把变量返回给外面,而是把变量存储的值返回给外面,相等于 return 300; } sum(100,200); // 执行这个函数,本身没有代表的值 var total = sum(100,200); //首先把函数sum执行,然后把sum执行的返回值(有return才有返回值)(看sum执行的返回结果,只需要看sum中是否存在return,有return,则其后面返回的值是什么,函数的返回值就是什么。如果sum中没有return,那么默认的返回值就是undefined),赋给外面的变量total //从函数体外面获取里面某值得时候,有return才能获取,么有return就是undefined ,单函数该运行运行 不影响 console.log(total);//total这个变量没有定义,即使有了return,返回的只是变量total存储的值,而不是变量total。 //函数执行的时候会形成私有作用域,包护里面的内容不受干扰,闭包机制,导致了函数体中定义的变量total,在函数体的外面不能直接获取到。 //例子::::: // function fn(){ // var total=300; // }; // var total=fn(); //执行这个函数,将函数执行的返回值 赋给变量total,fn这个函数中没有return,所以默认的返回值就是undefined。 // console.log(total); function fn(){ var total=2; return total*10; return;//在函数体中,return下面的代码不会执行,有终止函数体中代码执行的作用 }; console.log(fn);//输出当前函数本身 console.log(fn());//将fn执行的返回结果输出
四、arguments
// arguments 存储形参的一个集合 类数组 function sum(){ var total=null; for(var i=0;i<arguments.length;i++){ total+=arguments[i]; }; console.log(total);// 函数执行时才可以输出 return total; }; // sum(1,2,3); // alert(sum(1,2,3)); // 函数不执行时 有return也可以获取了 没有返回值是没有结果的 闭包机制 // ?????????? //任意数求和:::::::::必考 //无法定义形参个数 // arguments 函数天生自带的(不管写没写形参,不管是否传递值,arguments这个集合始终是存在的) 用来接收函数传递进来的参数的集合, function sum1(){ console.log(arguments);//arguments 是传递进来的参数的集合 console.dir(arguments); console.log(typeof arguments);// arguments 是一个对象数据类型,是个类数组 不是数组, //arguments 它是以数字作为索引值,索引为n存储的是第n+1个参数值,有length的属性,不是数组 叫类数组 // callee:function sum()... 他还有一个自己特殊的属性callee,代表当前函数本身 }; // var total = sum(); var total = sum1(100,200,300); /**/ function sum2(){ var total=null; for(var i=0;i<arguments.length;i++){ total+=arguments[i]; }; return total; }; console.log(sum2(2,3,4)); var total=sum2(2,3,4); console.log(total); console.log(sum2(2,3,"4")); console.log(sum2(2,3,"a")); //**/ function sum3(){ var total=null; for(var i=0;i<arguments.length;i++){ var cur=Number(arguments[i]);//把传进来的值转为number类型的 if(!isNaN(cur)){//判断cur是不是有效数字 total+=cur; }; //对于非有效数字不再进行累加操作,放在出现NaN // if(isNaN(cur)){//不是有效数字 ture continue才起作用 后面代码不执行; // continue; // }; // total+=cur; }; return total; }; console.log(sum3(2,3,"4","a")) //实名函数 //匿名函数:没有起名字的函数 //匿名函数分为两种: //1、自执行函数 ;+ - !~ 定义和执行一起完成 ;(function(){})(); +function(){}(); -function(){}(); !function(){}(); ~function(){}(); // 2、函数表达式 // 把函数定义的部分当做一个值赋给一个变量或者元素的某一个行为。 oDiv.onclick=function(){};