一、变量
1、如果变量在整个script中没有定义,直接使用或者打印,就会报错 b is not defined ;
2、如果变量在整个script中定义了,但是在定义前使用,则得到结果是undefined,不会报错 ;
3、如果在定义后使用则可以正确调用 ;
二、函数
含义:函数就是存储具有重复功能的代码
语法:第一种方式:声明式函数==function 函数名(形参1,形参2){执行体}
第二种方式:赋值式函数==var 函数名=function(形参1,形参2){执行体};
函数的调用:函数名(实参1,实参2); 且也可以在函数中写另外一个函数;
注意:声明式的函数调用时,可以存放在页面中任何位置,但是赋值式的不可以,只能是在函数定义之后;
函数的封装:就是把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口,类似快递打包;
三、函数的参数
1、实参:给形参进行赋值,从左到右的顺序,依次赋值;
2、形参:一个特殊的变量,只能在函数内部使用,定义变量;
注意:形参和实参的执行过程:先执行的函数调用,之后形参接收到实参,之后执行下面的代码;
3、参数的个数:可以有多个,用逗号隔开即可;
- 若实参大于形参,会出现实参丢失的情况,从左到右的顺序复制;
- 若实参小于形参,多余的变量会出现undefined的情况;
4、若我们忘记参数的时候,可以给一个提醒或者是默认值,以防止我们调用或者是其他人调用的时候忘记;
if(sum == undefined){
//第一种
alert('请传入参数')
//第二种:这里如果使用log的话,可能提示不太明显,注意不到,可以使用此方法
console.error('请传入参数')
}
或者给一个默认值:sum=变量的值
四、arguments
含义:是函数的内置对象,且只有函数有,作用可以存储函数实参的所有数据,是一个伪数组,无法使用数组的方法,且arguments是从0开始的;
伪数组的特点:有长度、有下标(0,1,2,3...)即按照索引方式存储数据、不具有数组push、pop等方法;
用途:当我们不确定有多少个参数传递的时候,可以用arguments获取,所有的函数中都存在一个arguments内置对象,arguments存放了所有传递的实参
function fn(){
console.log(arguments);
// 把每一项拿出来
/* console.log(arguments[0]);
console.log(arguments[1]);
console.log(arguments[2]); */
// 第一种求和
/* var res=arguments[0]+arguments[1]+arguments[2];
console.log(res); */
// 第二种
var sum=0
for(var i=0;i<arguments.length;i++){
console.log(arguments[i]);
sum+=arguments[i]
}
console.log(sum);
}
fn(1,2,3,)
五、return 的作用
- 函数返回值,可以在函数外面获取函数里面的值res;
- 组织代码的执行,return之后的代码都不再执行;
注意:(1)在函数外获取res的时候,我们需要在函数里面,return res ,之后重新定义一个变量n=函数,之后输出n即可;
(2)如果函数写了返回值return,后面没有内容,那么函数的返回结果就是undefined;
如果进行了折行操作,那么折行后的内容会被当做正常代码解析,不会输出;
(3)如果函数没有写返回值return,那么调用函数的返回值的时候结果为undefined;
六、预解析:
含义:在执行到script标签时,将当前script标签中的var定义的变量现在内存中开辟存储空间,并且 设定为undefined。在实际代码执行到var定义值之前这个变量已经存在,并且值为undefined,当执行到 var定义位置之后,这个变量才真实赋值为对应的结果。
// 第一种情况 :var
document.write(num) //输出是undefined
var num=10
document.write(num) //输出是10
// 分析:1、预解析的时候会把带有 var 和function 关键字的变量进行提升,提升到最前面
// 2、提升的只是等号左侧的内容
//第二种情况: function
fn() //123
function fn(){
var n1=10 //这个n1并不会进行预解析,只有等函数的调用之后才会开始预解析
document.write(123)
}
fn() //123
//分析:页面加载,首先会被作为字符串的形式提升到最上面,也就是浏览器在真正的赋值之前,已经知道了fn()是可以执行的
// 第三种情况: 赋值式函数
fnn(); //这里会报错,
var fnn =function(){
document.write(456)
}
fnn() //456
//分析:页面加载,页面只提升了fnn,那么此时的fnn就是一个变量名,接下来就从上往下解析,fnn是变量不是函数,所以fnn()就报错了
注意:如果变量名和函数名一样,优先执行函数
七、预赋值
含义:使用function直接定义的函数,在script标签刚开始时,就会预解析存储函数名在存储空间中,并且同时 将函数体这个引用地址赋值给这个存储空间中
八、 纯函数
函数中没有调用到外部的全局变量,也不会改变全局变量的结果,这个函数体是一个独立的存在,这种函数叫做纯函数
九、函数抽象
为了能够更好的将函数独立出来,只解决需要部分内容,达到纯函数,就要将函数内所有的部分独立不调用外部的变量,由函数的参数决定该函数执行后果,这种脱离整个项目结构的函数就是函数抽象