JS中:函数可以没有输入,但是会有输出,里面也有很多内置函数可以直接调用使用。
也可以自己定义 函数作用:封装功能块,用时可以直接调用
函数定义:
函数声明:
function f(参数1){} function 声明声明 f函数名 ()函数的特殊标志 函数体{功能块}
函数表达式(变量)
函数调用:函数定义好后,只有调用了才起作用
函数参数;
形参:函数定义时,()里面写的数,相当于局部变量,作用用来接收实参传递过来的值
实参:函数调用时,()里面写的数,用来给形参传递值
函数的返回值:
通过return 返回,返回到函数调用处
如果没有给返回值,默认返回undefined
注意: 在函数体重,return 后的代码不会再执行直接从return跳转,return也叫跳转语句
命名法
小驼峰命名法:toString()
大驼峰命名法:ToString()
下划线命名法:to_string()
作用域:
在JS中,作用域分为三类:全局作用域、局部作用域、块级作用域。在函数内部会形成局部作用域,
let{}会形成块级作用域
参数的传递:
基本数据类型的数据(值传递):
就是把栈区的内容复制一份给了形参,形参和实参是一个独立的内存空间,改变形参实参不会有影响
引用数据类型(引用传递):
就是把栈区的地址复制一遍给了形参,形参和实参共同指向堆区的同一内存空间
通过改变堆区内存空间的数据,实参这个地址对应的数据也会改变
函数可以作为另一个函数的参数,这个函数可以是函数声明也可以是函数表达式
arguments
函数调用的过程实际也是实参向形参赋值的过程,实参赋值一份给形参,还会复制一份给arguments。 arguments收集了实参
arguments只是函数内部的参数(类数组),在函数外面不能访问
arguments与实参具有一一对应的关系:
当改变实参时,arguments会随之改变;反之,一样;
什么时候使用arguments和形参;
当实参非常多,需要写很多形参接收,不方便时,可以使用arguments。
当实参有特殊含义,需要特殊标识时,可以用形参标识
JS有两个容器:
数组:[1,2,3,"hello"]获取某个元素时,使用索引
对象;{name:"wangc",age:100} name 和age叫key wangc和100叫做value
返回多个返回值
JS中默认只能返回一个返回值,想要返回多个就可以使用容器。
ES6中对函数的扩展
1、函数默认值,没有实参时,使用默认值,有实参使用实参
2、传递赋值时,实参的第一个会赋给第一个形参,依次排列、、
3、如果实参个数多于形参,后面的实参就会忽略
4、如果形参个数多于实参,后面形参的值为undefined;
扩展运算符:...
rest参数:...rest 在函数定义时的形参的位置写的...
代替arguments
定义函数时...
箭头函数 function(){} var g=function(){}
特点: 1、如果形参只有一个可以不写(),只有一个才能省,其他都不能
2、只有一个带return语句 {}和return都可以不写
3、只有一个不带return语句时,{}可以不写。
4、返回了对象,把{}和return省掉时,需要给对象加();
5、没有arguments用rest来代替
执行上下文
全局代码&局部代码
局部代码:在函数里面的代码
全局代码:默认进入的
全局执行上下文,函数局部代码:
执行全局代码,产生一个全局执行上下文:只有一个;
执行函数代码时,产生一个函数局部执行上下文
每调用一次,都会产生一个,可以有多个。
执行上下文的作用:
给全局代码或局部代码提供数据,可以是变量也