函数:一段代码块,一般一个功能就会封装成一个代码块,可以重复使用。
创建函数
// 使用function关键字来创建一个函数
function 函数名(){
// 具体功能的代码实现
}
// 函数不会自己执行,需要调用
函数名();
function fun(){
console.log(123);
}
fun(); // 打印123
形参和实参
函数名后小括号内传递的参数
// 声明函数时传递的参数叫做形式参数--形参
function add(x,y){
console.log(x+y);
}
// 调用函数时传递的参数叫做实际参数--实参
add(1,2); // 打印3
// 多余的实参会被忽略
add(1,2,3); // 打印3
// 多余的形参默认为undefined
add(1); // 打印NaN
形参默认值
// 如果没有传递实参,则形参使用默认值
function add(x=10){
console.log(x);
}
add(); // 打印10
返回值
// 使用 return 关键字返回一个表达式或者函数
function add(x,y){
const sum = x+y;
return sum;
}
let result = add(1,2);
console.log(result); // 打印3
// return会让函数提前结束调用(在函数内return后面的代码不执行)
function fun(){
return;
console.log('haha'); // 不打印
}
fun();
return xxx 不能换行,否则返回值为undefined
一个函数没有 return,默认返回undefined
arguments
arguments是一个伪数组,函数内部的一个内置对象,用来接收所有实参
伪数组:可以使用[下标]对元素进行操作,但不能使用数组的方法
function fun(a,b){
console.log(arguments);
}
fun(1,2); // [1,2]
封装函数
我们通常将不同功能封装成一个函数,下面是一个例子,功能与indexOf方法相同
// 判断某个元素是否存在于数组中,存在则返回该元素下标,不存在则返回-1
function findEleInArray(ele,arr){
for(let i=0;i<arr.length;i++){
if(arr[i] === ele){
return i;
}
}
return -1;
}
const arr = [1,2,3,4,5];
findEleInArray(3,arr); // 值为2
findEleInArray(6,arr); // 值为-1
匿名函数
匿名函数:没有名字的函数,又叫函数表达式(有名字的函数:具名函数)
// 变量fn指向函数(这个函数就是一个匿名函数)
const fn = function(){
console.log('hello');
}
fn(); // 打印hello
具名函数与函匿名函数的区别
f1();
function f1(){} // 具名函数可以先调用,后声明
f2(); // 报错
const f2 = function(){} // 函数表达式必须先声明,后调用
// js代码在执行的时候,分为预解析和代码执行
// 预解析:把变量和函数声明拿到代码的最前面
// 预解析不会把const或let定义的进行提升
匿名函数自调用
IIFE (Immediately Invoked Function Express)
匿名函数自调用 / 自执行匿名函数
该函数在定义时就会执行一次
// 第一种写法
(function(){
console.log(1);
})();
// 第二种写法
(function(){
console.log(1);
}());
IIFE同样可以传参数
let num = 10;
(function(a){
console.log(a); // 打印10
})(num);
作用:防止变量全局污染
// 由于函数作用域,两个num互不影响
var num = 10;
(function(){
var num = 20;
})()