javascript . 03 函数定义、函数参数(形参、实参)、函数的返回值、冒泡函数、函数的加载、局部变量与全局变量、隐式全局变量、JS预解析、是否是质数、斐波那契数列
1.1 知识点
- 函数:就是可以重复执行的代码块
- 2. 组成:参数,功能,返回值
- 为什么要用函数,因为一部分代码使用次数会很多,所以封装起来, 需要的时候调用
- 函数不调用,自己不会执行
- 同名函数会覆盖,后面的覆盖前面的
- 函数名等于整个函数,打印函数名,就等于打印整个函数的代码
- 7. 加载函数的时候只加载函数名,不加载函数体
- 参数相当于局部变量
- 两个平级的函数中变量不会相互影响
- 10. 预解析:函数在解释文档的时候会被整体提到文档的最前面,和加载不一样
- 第一种:解析的时候会被提前,可在任何地方使用和定义
1.2 函数的定义
- 第一种:解析的时候会被提前,可在任何地方使用和定义
1. function fun ( a , b ) { 函数体;return ; }
- 第二种:函数不会被提前,使用必须在定义之后
2. var fn2 = function ( ){函数体;}
3. //函数名可有可无,无名叫匿名函数
- 第三种:函数不会被提前,使用必须在定义之后,如果函数体不加引号,不调用也会执行
1. var fn3 = new Function(“函数体;”);
1.3 函数的参数
- 设置参数可解决修改值不修改规则这个问题。
- 增强函数的功能性,和程序员的交互性,和函数的可拓展性
- JS没有方法重载
- 规则中有几个变化的数(操作数),就定义几个参数
- 函数可嵌套
- 开闭原则
- Math.sqrt( ); 开平方
形参
- 形式上参与运算的值,作用是为实参占位置
- 实际上参与运算的值
- 实参要进行运算,必须要有形参占位置
- 相等,正常执行
- 实参个数大于形参,正常执行,多去的舍弃不用
- 形参大于实参,看程序是否出错
实参
形参的个数和实参的个数不一样
a) 计算会得到NaN
b) 实参值是undefined 为给定实参的形参是undefined
c) 任何值和undefined计算都的NaN
1.4返回值
- 执行函数完毕之后,返回的数据
- 函数程序运行后的结果外边需要使用的时候,我们不能直接给予,需要通过return返回
- 作用:函数执行完成以后,结果就是返回值
- 有return的函数就有返回值,反之则没有
- 把函数内部的值赋值给外部
- 6. 如果没有return或者只有return没有值,函数默认返回undefined
- 函数执行完return后会立即结束,return后面的代码不会执行
- 函数的返回值必须要执行才可以得到
- 外部要用那个值,我们就返回哪个值
- return可以截断循环
- Math.round()四舍五入
- Math.pow( a , n); a的n次幂
- Math.floor();地板函数
- var s = Math.floor( Math.randow() * (max-min+1) + min ); //生成min-max之间的随机数
- 函数内用的必须是形参的数组
- bubble 冒泡
- 冒泡排序极限后会出现问题
1 var arr = [4,435,234,1223,645,341,123,124,562]; 2 function bubble(arr) { 3 for(var i=0;i<arr.length-1;i++){ 4 var flag = true; 5 for(var j=0;j<arr.length-1-i;j++){ 6 if(arr[j]>arr[j+1]){ 7 var temp = arr[j]; 8 arr[j] = arr[j+1]; 9 arr[j+1] = temp; 10 flag = false; 11 } 12 } 13 if(flag){ 14 break; 15 // 此处若直接使用return(arr) ,则不能返回正确的值,个人理解为,此处为局部变量,不能正确返回 16 } 17 } 18 return(arr); 19 } 20 // console.log(bubble(arr))
18.函数通过运算来的数一般都是半成品,需要二次加工
1.5 函数名、函数体和函数加载问题
- 打印函数名,等于打印了整个函数的代码
- 打印执行函数,等于打印函数的返回值
a) 函数包函数先执行内部函数
3. JS加载的时候,只加载函数名,不加载函数体
1.6 变量作用域
局部变量
- 只有局部能够访问的变量
- 函数内部用var定义的变量
- 函数执行完毕后,局部变量被回收
全局变量(成员变量)
- 在哪里都可以访问的变量
- 在函数内部,直接定义变量,不加var为全局变量,函数必须得执行后才可以使用
1.7 隐式全局变量(不要不这样写)
- 一般存在函数之中
a) var a = b = c = 1; //这种情况,b和c都是隐式全局变量
b) var a = 1; b = 2; c = 1; //这种情况,b和c都是隐式全集变量,分号相当于换行
c) var a = 1, b = 2, c = 1; //这种情况,b和c不是隐式全局变量
1.8 预解析:JS解析器
- 查看语法错误
- 变量声明提升(只提升变量名,不提升变量值),
- 把内容加载到内存中
a) 对象加载到堆中
b) 简单类型加载到栈中
- 用function定义的函数整体提升
a) 函数内照样适用
b) 就近原则,
5. 预解析(整体提升函数)和函数加载(只加载函数名)的区别
6. 预解析:检查script标签内的语法,提升函数声明
7. 函数加载:把函数加载到内存中
8. 解析完再加载
// 测试是否是质数
1 function isPrime(n){ 2 for(i=2;i<n/2;i++){ 3 if (n%i == 0 ){ 4 return false; 5 } 6 } 7 return true; 8 } 9 confirm (isPrime(7));
斐波那契数列
1 function fibonacci(n){ 2 if (n<3){ 3 n=1; 4 return n; 5 }else { 6 var k = 1, j = 1; 7 for (i = 3; i <= n; i++) { 8 j = j + k; 9 k = j - k; 10 } 11 return j; 12 } 13 }
获取输入年月日,确定是今年的第几天
console.log(getDay(2016,3,1)); function getDay(year,month,day){ var arr = [31,28,31,30,31,30,31,31,30,31,30,31]; var sum = day; if(year%4==0 && year%100!==0 || year%400==0){ arr[1]=29; } for(var i=0;i<month-1;i++){ sum += arr[i]; } return sum ; }
作者:明明
出处: http://www.cnblogs.com/mingm/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。