(一) 作用
封装一段待执行的代码,减少代码的冗余,重复使用
(二) 语法
//函数声明
function 函数名(参数列表){
函数体
return 返回值;
}
//函数调用
函数名(参数列表);
注:若实参的个数多于形参的个数,会取到形参的个数;
若实参的个数少于形参的个数,多于的形参定义为undefined,结果是Nan
定义形参就相当于在函数作用域中声明了变量
函数名自定义,见名知意,命名规范参照变量的命名规范。普通函数以小写字母开头,用于区分构造函数(构造函数使用大写字母开头,定义类)
-
函数的返回值 return
function (){
return;
}
注:return语句之后的代码不被执行,只能返回一个结果,返回多个值时,借用数组。
若函数没有retuen ,返回undefined
//使用break可以退出当前的循环 ; // continue用于跳过当次循环
//使用return可以结束整个函数
-
arguments的使用
当我们不确定有多少个参数传递的时候,可以用arguments来获取。在JavaScript中,arguments实际上它是当前函数的一个内置对象。所有函数都内置了一个arguments对象,arguments对象中存储了传递的所有实参。
function (){
console.log(arguments) //[1,2,3]
}(1,2,3)
function getMax(){
var max = arguments[0];
for(var i = 1; i< arguments.length;i++){
if (arguments[i] >max){
max =arguments[i]
}
}
return m
}
getMax(2,5,3)
getMax(2,5,3,56)
(三)匿名函数
匿名函数:省略函数名的函数。语法为:
-
匿名函数自执行
(function (形参){
})(实参);
-
定义变量接收匿名函数
var fn = function (){};
fn(); //函数调用
四)作用域
JavaScript 中作用域分为全局作用域和函数作用域,以函数的{ }作为划分作用域的依据
-
全局变量和全局函数
-
直接编写在script标签中的JS代码,都在全局作用域全局作用域在页面打开时创建,在页面关闭时销毁 在全局作用域中有一个全局对象window. 它代表的是一个浏览器的窗口,它由浏览器创建我们可以直接使用
-
所有省略 var 关键字定义的变量,一律是全局变量
-
-
局部变量/局部函数
-
使用函数声明形式创建的函数function 函数(){} 它会在所有的代码执行之前就被创建,所以我们可以在函数声明前来调用函数使用函数表达式创建的函数,不会被声明提前,所以不能在声明前调用
-
-
作用域链 局部作用域中访问变量或函数,首先从当前作用域中查找,当前作用域中没有的话,向上级作用域中查找,直至全局作用域
6.预解析
JavaScript代码是由浏览器中的JavaScript解析器来执行的。JavaScript解析器在运行JavaScript代码的时候分为两步:预解析和代码执行。
-
预解析
-
变量预解析(变量提升)
把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
-
函数预解析(函数提升)
把所有的函数声明提升到当前作用域的最前面 不调用函数
-
引擎会把js里面所有的 var还有 function提升到当前作用域的最前面
-
代码执行
f1();
console.log(c);
console.log(b);
console.log(a);
function f1(() {
var a = b =C= 9;
console.log(a);
console.log(b);
console.log(c);
}
//以下代码
function f1() {
var a = b =c=9;
//相当于var a= 9; b = 9; c= 9; b 和c直接赋值没有var声明当全局变量看
//集体声明var a = 9, b = 9, c = 9
console.log(a); //9
console.log(b); //9
console.log(c); //9
}
f1();
console.log(c); //9
console.log(b);//9
console.log(a); //undefined
(五)高阶函数
高阶函数是对其他函数进行操作的函数,它接收函数作为参数或将函数作为返回值输出。
function fn(callback){
callback&&callback()
}
(六)闭包
闭包( closure )指有权访问另一个函数作用域中变量的函数。
function fu(){
var num = 10;
function fun(){
console.log(num)
}
fun();
}
(七)递归
一个函数在内部可以调用其本身
递归函数的作用和循环效果一样 由于递归很容易发生“栈溢出”错误( stackoverflow ),所以必须要加退出条件return。
-
阶乘
function fn(n){ if(n==1){ return 1; } return fn(n-1)*n }
-
斐波那契数列
//1 1 2 3 5 8 function fn(){ if(n==1||n==2){ return 1; } return fn(n-1)+fn(n-2) }
-
递归遍历数据
function getID(json,id){ json.forEach(function(item){ if(item.id==id){ console.log(item) }else if(item.goods&&item.goods.length>0){ getID(item.goods,id) } }) }