什么是函数?
封装可重复执行的代码块
声明函数的方法?(两种)
字面量声明:
let fn = function(){}
关键字声明:
function fn1(){ }
两种声明方式的区别:
字面量声明的函数属于匿名函数、在函数赋值之前是不能调用的
匿名函数不能作为构造函数使用
关键字声明的函数 声明前后都可以调用
函数function var
function var 声明的变量都存在变量提升
function比var提升的更高
函数的形参
形参 --形式上的参数 和 实参 --实际的参数
function add(x,y,z){ //var x,y,z
console.log(x+y) //3
}
add(1,2)
同时声明多个变量时
var a = 1,b=2
console.log(a,b) //1 2
函数返回值
函数的返回值 使用 return ;如果有函数有返回值,函数调用的时候会返回;如果没有,返回undefined
return 之后 代码不会在执行了
递归
函数内部调用函数
要有终止条件
优点:递归的优点就是简洁、易于理解。
缺点: 递归通常会出现许多重复计算,导致时间复杂度高。
调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。
let sum = 0
function add(num){
if(num>10){
return
}
sum+=num
add(num+1)
}
add(1)
console.log(sum)
运算符
var a = 1
var b = 2
console.log(a / b)
console.log(a**b)
console.log(b**b)
console.log(a<b)
console.log(7>5>4) // false
console.log(4<5<7) // true
console.log(7>5==1)
= 赋值 == 值是否相等 === 值 数据类型
a++ 先赋值 后计算
++a 先计算 后赋值
if判断
switch(num){
case 0:
break
case 1:
break
default:
}
作用域
变量可使用的范围
作用域链
当使用一个变量的时候 会现在当前作用域查找 如果没找到 会继续向上一层作用域查找 直到找到为止 找不到就报错
闭包
函数嵌套函数
用处:1.读取函数内部的变量;
2.这些变量的值始终保持在内存中,不会在外层函数调用后被自动清除。
优点:1:变量长期驻扎在内存中;
2:避免全局变量的污染;
3:私有成员的存在 ;
特性::函数套函数;
2:内部函数可以直接使用外部函数的局部变量或参数;
3:变量或参数不会被垃圾回收机制回收 GC;
缺点: 常驻内存 会增大内存的使用量 使用不当会造成内存泄露
function fn(){
var a = 10
return function(){
return a
}
}
console.log(fn()())