函数是干什么的?
如何定义函数?
参数(形参 实参)
argument 参数
arguments 参数集合
return的作用
1.函数的作用
-JS是从上到下执行代码,有的时候需要定义一个方法只有特定条件才会执行这个方法,那么此时我们就需要这些代码,默认时不执行,只有触发时才执行
-定义一个函数,这里可以用,那里也可以用,函数可以一次定义多次调用,并且互不影响
定义函数的方式
关键字 函数名(){要执行的函数代码块}
执行函数;
函数名();
函数名
函数名()
这两者区别是什么***
函数名后面没有括号,这个函数名就是一个代表整个函数的变量,用来代表函数和存储函数;
函数后面右括号,代表这个函数已经执行完成的结果.
函数名() 代表函数执行完成,接受到的是返回值,此处的返回值如果没有设定,接受值为Undefined,如果设定,设定的是什么接受的就是什么.
return 后面的是什么,返回的就是什么,如果只写return不写值,返回的依然是Undefined.
函数内return后面的代码就不会执行了
return 返回值是一个值.
私有变量:函数内定义的变量,函数外不能够获取到
如果想让外界获取私有变量代表的值,需要将这个值返回到函数外,return只能将变量代表的值返回到函数外,变量依然是私有的,谁来接受这个值呢?函数名()来接受
函数的返回值是需要人为定义的,函数不会主动将之值返回到函数外面.
函数的参数
-形参:就是用来接收实参的变量,用来代表和储存实参
-实参:传入到函数内具体的值
形参和实参是一一对应的关系,如果形参定义,而实参没有传,则返回undefined
函数定义
function name(形参1,形参2...){};
函数执行
name(实参1,实参2...);
形参相当于只是声明的变量,但没有赋值,传入实参后,形参被赋值.
arguments
arguments是用来接受实参的一个对象
就收到的实参放在一个'[]'中括号中,每一个实参用逗号分隔开,我们将这个对象接受到的值叫做类数组(不是官方叫法,官方叫argument对象)
function ar1(){
console.log(arguments);
}
ar1();
函数用来接收参数的方法:
形参
arguments
=>封装:把实现一个功能需求的代码封装在一个函数中,以后如果需求要实现这些功能,代码不用重复写了,我们只需要直接调用函数执行即可,
"低耦合高内聚":减少页面中的冗余代码,提高代码的重复利用率
拿洗衣机比喻说明:
function 洗衣机( 水入口,洗衣液入口,不干净衣服入口...){
我们把函数的入口叫做形参:形参的作用就是提供一个入口,让用户可以给他穿内容(实参);以后项目中,凡是我们需要做一件事,原材料不知道,需要用户执行的时候提供,我们都定义形参,相当于给用户提供了入口
函数体:实现这个功能的具体步骤和代码
干净的衣服=水+洗衣液+不干净的衣服;
返回值:函数的出口,提供一个出口,供函数外面的用户可获取到产出的结果return=>把干净的衣服给用户
}
var 结果=洗衣机(哇哈哈,酱油,袜子); ->结果:干净的衣服 传递给函数的三个值叫做"实参"
例子:
需求:定义一个函数sum,实现两个数求和,把求和的结果在函数的外面输出
function sum(n1,n2){
var n3=n1+n2
return n3 return->后面返回的是啥,函数执行的结果就是啥,函数不写return或者return后面时空,默认返回的结果是undefined;函数体重return后面的代码将不再执行;
}
var res=sum(1,1)传输实参
console.log(n3) 返回值就是1+1=2也就是(2)
定义了形参没有传递实参实参的话,默认实参的值是undefined
如果形参为空 实参也可以传入只是没有形参去接収而已
例子2:
需求:需求同上不一样的法地方:之前是求两个数的和,现在我们具体几个数不知道,可能是三个,也可能是四个,也可能是100个,这咋办....?
function sum(num1,num2){
arguments->实参集合:包含传递进来的所有参数值,而且不管你是否定义形参,也不管是否传递了实参,arguments就在这里(函数天生自带的)
num1 ->10
num2 ->20
arguments ->类数组(类似数组,但不是数组:也是以数字作为索引,索引从零开始,逐级递增,有一个叫length的属性代表长度)[0:10,1:20,2:30,3:40,length:4]如果不传递任何实参,arguments就是一个空的类数组[length:0]
}
sum(10,20,30,40)
function sum(){
var total=null;
for(var i=0;i<arguments.length;i++){
var total+=arguments[i] arguments[i]->每一次循环获取的arguments中的当前项,也是传递进来的某一个实参
}
return total;
}
var res=sum(10,20,30,40);
=============
为了不影响最后的结果我们把用户传递的实参中非有效数字进行过滤,只把有效数字进行相加
function sum(){
var total=null;
for(var i=0;i<arguments.length;i++){
首先把传递进来的实参转换成数字类型的:转换完成后的结果不是有效数字就是NaN
total+=arguments[i];
if(isNaN(cur)){
为true说明不是有效数字,不累加
continue; ->结束当前循环,继续执行下一次,continue后面代码不执行(break认真总结两者区别)
}
total+=cur;
}
return total
}
var res=sum(10,20,'30','珠峰',40);
========================
当浏览器加载页面的时候,会提供给我们一个共JS代码执行的环境 =>全局作用域(window)
定义一个函数:
1.开辟一个新内存空间(xxxfff000)
2.把函数体中的代码以字符串的方式存储到空间中(对象数据类型是把属性和属性名存储到空间中)
3.最后把空间的地址赋值给函数名或者对象名(让名字和地址建立了关联)
(函数如果只定义不执行的话,是没有任何意义的(定义的时候储存的只是一堆字符串)=>洗衣机买了不用就是废铁)
函数执行:
1.首先开辟一个新的运行空间->私有作用域
2.给形参赋值/私有作用域中的预解释
3.把之前存储的代码字符串,变为真正的代码,然后从上到下执行
...