1.作用域
变量的使用区叫作用域
a.全局作用域
在script内的变量 在哪里都可以使用 浏览器在运行的时候会把我们的所有对象放在window里面
<script>
var a = 100
var a1 = "window"
</script>
b.局部(函数)作用域
简单的来说就是在函数内部的变量(大括号里面) 只能在函数内部使用 不会存在window里面
function fn () {
var b = 100
console.log(b)
}
2.变量的访问规则和赋值规则
相同点 :两者都是只会向上找
区别 :
变量访问规则 :先在当前作用域查找--如果找不着向上一层查找--一直向上查找--如果到全局作用域还是找不到就会报错
赋值规则 :先在当前作用域查找--如果找不着向上一层查找--一直向上查找--如果到全局作用域还是找不到就会将变量定义为全局变量 并赋值(就是自己本身的值)
补充点:作用域链 先在当前作用域查找--如果找不着向上一层查找--一直向上查找 这种一层一层向上找一个链条叫作用域链
3.递归函数
条件:a 一个函数内部调用了本身
b 还有一个结束条件(转折点) 如果没有转折点会一直执行下去 会是一个死递归 对电脑不友好
如果不太好理解我们来举一个例子:
计算一个阶层的值
function fn (n) {
if (n == 1) {
return 1
}
return n * fn(n - 1)
}
var sum = fn(8) //接收返回值
console.log(sum) //打印返回值
首先我们要知道数学上的阶层是什么?例如:100的阶层
100! = 100*99*98*97........*2*1 //这就是100的阶层
我们可以发现:
100! = 100 * 99!
99! = 99 * 98!
第一次循环
实参 : 8
形参 n = 8
if判断不执行
返回一个return 8 * fn(7)
fn(7)
/**
* 实参 : 7
* 形参 : n = 7
* if判断不执行
* 返回一个return 7 * fn(6)
...........
fn(1)
/**
* 实参 : 1
* 形参 : n = 1
* if判断执行(满足n == 1)
* 返回一个return 1
如果还是不太理解,我们从生活出发:
如果我要去看电影,可是由于一些原因,我来晚了,电影已经可是,我走了进去 黑灯瞎火的我不知道我在几排 我问我旁边的小姐姐 我在想她说了我肯定可以推出我在第几排,可是她不知道,她又问了前面一排的人,前面一排也不知道,就一直这么问下去,直到问到第一排(转折点 结束条件),她又告诉后面一排的人我在第一排 一直这样告诉下去我就知道我在第几排了.