函数基本概念
函数:就是封装了一段可被重复调用执行的代码块,通过此代码块可以实现大量的代码的重复使用。
而函数的封装就是把一个或多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口
arguments的使用
作用:当我们不确定有多少个参数传递,可以用arguments来获取。
arguments对象里面存储了所有传递过来的实参,它们以伪数组的形式存在
例如:用来计算任意多个数最大值
function getMax(){
var max=arguments[0]
for(var i=0;i<arguments.length;i++){
if(arguments[i]>max){
max=arguments[i]
}
}
}
getMax(12,34,28,2547)
自调用函数
(function(){
var num=100
console.log(num)
})()
作用:形成局部作用域,避免全局污染
函数声明的两种方式
1.函数关键字
2.函数表达式
function关键字
function fn(){
}
fn(); //function声明前都可以调用
函数表达式(赋值式)
// var 变量名 = function(){}; var 声明后才能调用
var fun = function(aru){
console.log('谢谢你,云顶猫咪');
console.log(aru);
}
fun('eee');
//fun是变量名,不是函数名
// 函数表达式声明方式跟声明变量差不多,只不过变量里面存的是值,而函数表达式里面存的是函数;
//函数表达式也可以进行传递参数
变量使用规则:访问规则和赋值规则
访问规则:向上查找,到最外层仍然没有则报错。
赋值规则:基于作业域链,向上查找,如果最外层没有则把这个变量定义为全局变量,给他赋值。
从执行效率来看全局变量和局部变量
- 全局变量只有浏览器关闭时才会销毁,比较占内存资源
- 局部变量 当我们程序执行完毕就会销毁,比较节约内存资源
- 没有var 声明的变量当全局变量
作用域链符合就近原则
预解析
我们js引擎运行分为两步: 预解析 代码执行
- 预解析js引擎会把js 里面所有的 var 还有 function 提升到当前作用域的最前面
- 代码执行 按照代码书写的顺序从上往下执行
var num =10; //变量提升
function fn(){ // 函数提升
console.log(num);
var num = 20; //变量提升
console.log(num);
}
fn();
// 相当于以下代码
// var num;
// function fn(){
// var num;
// console.log(num);
// num = 20;
// console.log(num);
// }
// num = 10;
// fn();
递归函数
什么是递归函数?
在函数体中自身调用自身,这样的函数称为递归函数。 递归结束条件 后面的结果,由前面推导
//计算1+2+3+4+5=?
function diGui(n){
//结束递归条件
if(n==1){
return 1
}
//找后面求的结果与前面关系
return diGui(n-1)+n
}
document.write( 'sum',diGui(5))
//5 4 f(n-1)+n n为最后一位