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 冒泡
- 冒泡排序极限后会出现问题
var arr = [4,435,234,1223,645,341,123,124,562];
function bubble(arr) {
for(var i=0;i<arr.length-1;i++){
var flag = true;
for(var j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = false;
}
}
if(flag){
break;
// 此处若直接使用return(arr) ,则不能返回正确的值,个人理解为,此处为局部变量,不能正确返回
}
}
return(arr);
}
// 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){
for(i=2;i<n/2;i++){
if (n%i == 0 ){
return false;
}
}
return true;
}
confirm (isPrime(7));
斐波那契数列
function fibonacci(n){
if (n<3){
n=1;
return n;
}else {
var k = 1, j = 1;
for (i = 3; i <= n; i++) {
j = j + k;
k = j - k;
}
return j;
}
}
获取输入年月日,确定是今年的第几天
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 ;
}