JS函数
1、JavaScript中函数的基础知识
对代码实现复用
1-1声明函数的方式
- 字面量声明函数
function函数名(形式参数){
}
函数名:就是我们调用函数时需要书写的标识符
形式参数:简称形参,是调用函数时需要接收的参数
实际参数:简称实参,是调用函数时实际传递过去的参数
如:function test(name){
console.log(”Hello,"+name)
}
test("xie jie");
- 函数表达式声明函数
let变量=function(){
函数体
}
如:let test=function(name){
console.log(”Hello,"+name);
}
test("xie jie")
- 构造器声明函数(少用)
let变量=new Function(”参数”,”参数”,”函数体”)
函数的调用:调用函数,那么就必须要有括号。
1-2函数的返回值
关键字为return,代表要从函数体内部返回给外部的值。
即使不写return,函数本身也会有返回值。Undefined
let test=function(){
console.log(”Hello")
}
let i=test(); //hello
console.log(i); //undefined
需要注意的是,return后面的代码是不会执行的,因为在函数里面一旦执行到return,整个
函数的执行就结束了。
return关键字只能返回一个值,如果想要返回多个值,可以考虑返回一个数组
1-3函数的参数
1-3-1实际参数和形式参数
关于形参:
- 参数名可以重复,同名的参数取最后一个参数值
- 即使函数声明了参数,调用时也可以不传递参数值
- .调用函数时可以传递若干个参数值给函数,而不用管函数声明时有几个参数
function test(x){
console.log(x);
}
test(1,2,3);//1
因为当一个函数要被执行的时候,系统会在执行函数体代码前做一些初始化工作,其中之一就是为函数创建一个arguments的伪数组对象。这个伪数组对象将包含调用函数时传递的所有的实际参数。因此,arguments的主要用途是就是用于保存传入到函数的实际参数的。
如:function test(x){
for(let i=0;i<arguments.length;i++){
console.log(arguments[i]);
}
}
test(1,2,3); //1 //2//3
1-3-2不定参数
不定参数是从ES6开始新添加的功能,在最后一个形式参数前面添加3个点,会将所有的实参放入到一个数组里面,示例如下:
不定参数 放置后面,会形成数组 如果放前面报错
function test(a,...b){
console.log(b);
}
test(1,2,3,4,5,"f");
1-3-3默认参数
1.从ES6开始,没传实参,就用默认值,如有实际参数,就传实际参数
function test(name="world"){
console.log("hello",name);
}
test()
test("xixi")
2. 如果参数是一个数组
function([a=1,b=2」=[ ])
3.换成对象亦可
let fn=function({name="xiong",age=18}={}){}
1-4函数属性和方法
1-4-1. name属性
表示函数的函数名
1-4-2length属性
表示形式参数的个数
arguments.length 调用函数实际参数的个数。
2、箭头函数
2-1基本介绍
从ES6开始新增加的一种声明函数的方式,
基本语法:let变量=(形式参数)=>{函数体}
尽量按照基本语法写,以下了解
//如果没有参数
let变量=()=>{
}
//一个形参可不要括号
let变量=形参=>{
}
//只有一个返回值,可不要return
let变量=形参=>expression
3、变量提升与函数提升
3-1作用域
全局作用域:这个是默认的代码运行环境,一旦代码被载入,引擎最先进入的就是这个环境。
函数作用域:当进入到一个函数的时候,就会产生一个函数作用域
函数内部可以访问到全局或外层,外层不可访问里面的。
eval作用域:当调用eval函数的时候,就会产生一个eval作用域(少用)
在函数里声明变量时,使用var,let const,外部都不能访问这个变量,但是声明变量不使用关键字时可以访问,相当于使用var,但是不会产生变量提升。
let test=function(){
x=3;
}
test();
console.log(x)
3-2变量提升
所谓变量提升,就是指在使用var关键字进行变量声明的时候,默认会将声明变量的部分提升至当前作用域的最顶上,但是注意提升的只有变量的声明部分,赋值是不会提升的。
3-3函数提升
所谓函数提升,是指当我们使用字面量方式来声明一个函数的时候,此时函数的声明会提升到当前作用域的最顶端,这意味着我们可以将函数的调用书写到函数的声明之前。
test();
function test(){
console.log(”Hello!”)
}
但是使用函数表达式就不会提升,如果在声明函数表达式时用var可以产生变量提升。
4、回调函数
4-1基本介绍
指将一个函数作为参数传递给另外一个函数,然后在另外一个函数里面执行传递过去的函数。
回调函数可以和其他参数一起传入到一个参数里面
let test = function(name,fn){
console.log(`My name is ${name}`);
fn();
}
let test2 = function(){
console.log("I'm coding");
}
test("xiejie",test2);
// My name is xiejie
// I'm coding
4-2常见回调函数介绍
- sort()
console.log(arr.sort(function(a,b){
return a - b;
// b - a
}));
- 迭代方法
every()对数组的每一项运行给定的函数,如果该函数每一项都返回true,则返回true
every 全真则真,有假则假
let arr=[2,3,4,5,6,7,8];
let i=arr.every(function(item){
if(item%2==0){
return true;
}else{
return false;
}
})
console.log(i) //false
some(),该方法可以对数组的每一项运行指定的函数,如果该函数只要有一项返回true则返回true。 有真即为真
filter() : filter是过滤的意思,所以这个方法会返回一个数组,数组里面是返回true的元素
// filter()选出true的元素放进数组
let arr=[1,2,4,5,6,8]
let i=arr.filter(function(item){
if (item%2==0) {
return true;
}else{
return false;
}
})
console.log(i) //[ 2, 4, 6, 8 ]
forEach():将数组每一项传入到函数,然后执行该函数里面的代码。需要注意一下的是,该回调函数没有返回值。
Map()对数组的每一项运行test函数,返回一个数组,这个数组是每次调用函数后的运行结果