目录
一、函数
Number()/parseInt()/parseFloat()/alert()/prompt()...
函数分为系统函数和自定义函数
函数:function,是一个功能体,提供若干个数据,返回处理的结果,用于封装重复执行的代码
1.创建普通函数
function 函数名称(){
函数体 //封装的重复执行的代码
}
函数名(); //函数创建后,需要调用
2.带有参数的函数
参数:创建函数时的参数称作形参,调用函数时的参数称作实参,实参会赋值给形参;实参和形参数量可以不相同,如果形参未被赋值则为 undefined
function 函数名称(参数列表){
函数体
}
函数名称(参数列表);
3.带有返回值的函数
return 用于返回函数调用后的结果
如果函数中没有 return 或者return后不加任何的值吗,则返回结果为 undefined
return 执行后,就会结束函数的执行
function 函数名称(参数列表){
函数体
return 值;
}
函数名称(参数列表);
对比 return 和 break:
break 用于函数中,结束函数的执行
break 用于循环或者 switch-case ,结束循环或者 switch-case 的执行
二、变量的作用域
作用域:起作用的范围
全局作用域:在函数外就是全局作用域,声明的变量称作全局变量,可以在任意的作用域下访问到
函数作用域:在函数内就是函数作用域,声明的变量称作局部变量,只能在当前的作用域下访问到
!!!在函数内,不加 var 声明的变量是全局变量。不推荐这种写法
变量的提升:程序执行前,会将var声明的变量提升到所在作用域的最前边,只是提升声明,赋值不提升
三、函数作用域
var a=1;
function fn(){
a=a+1;
}
fn(a); // 2
1.全局函数
在全局作用域下创建的函数,可以在任意作用域下访问
2.局部函数
在函数作用域下创建的函数,只能在当前函数作用域下访问
3.作用域链
函数作用域下,嵌套了其它的函数,形成的作用域结构;在查找变量的时候,先往当前作用域下查找,如果没有会不断的往上一级作用域下查找
4.函数提升
程序执行前,会将函数提升到所在作用域的最前边
四、递归
1.函数递归
在函数内部调用自身这个函数,默认是一个死循环
2.递归的使用
要有边界条件
需结合 return 使用
JS运行为单线程,无法充分利用CPU内核。深层次的递归嵌套JS运算缓慢
3.案例
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少个桃子?
function peach(n) {
if (n===10){
return 1;
}
return (peach(n + 1) + 1) * 2;
}
console.log( peach(1) ); //1534
五.匿名函数
没有名称的函数就是匿名函数
1.创建函数
//函数声明
function (){
}
//函数表达式方式
var fun=function(){
}
- 函数名称:本质上就是一个变量
- 函数名称():调用一个函数,执行函数体中的代码,得到函数的返回值
区别函数声明与函数表达式
- 函数声明存在函数的提升,可以先写调用再写创建
- 函数表达式只是提升变量的声明,不提升赋值,必须先写创建再写调用
2.匿名函数自调用
创建一个函数作用域,防止全局污染
(function(){
//函数作用域,里面的变量都是局部变量
})();
3.回调函数
将函数以参数的形式传递,传递的这个函数就是回调函数
function a(){
}
function b(n){
n(); //调用传递的函数
}
b(a);
六.系统函数
isNaN:检测一个值是否为NaN,用于检测用户输入的值是否为数字,会隐式将数据转为数值型
isFinite():检测一个值是否为有限值,只有无穷 (Infinity)是无限值
eval(): 执行字符串中的表达式