十九. 作用域
变量使用使用区间的,变量不是说声明之后在哪里都可以用,他有一个使用的范围,称为作用域
作用域分为
1.全局作用域 JS给我们提供了一个叫做window的全局作用域,可以理解为整个script标签内的作用域,就是全局作用域
2.局部作用域 在JS中,有且只有函数能够创建局部作用域(函数作用域),局部作用域开始和结束位置,就是函数代码段的开始和结束位置,局部作用域(函数作用域)内声明的对象叫做局部变量 局部变量会挂载到window上
例:var num = 100; 根据规则这里是script标签内部,所以是全局作用域,所以这个num也可以叫做全局变量
二十.作用域链
在查找变量时,会先在当前作用域内查找,找到就用,没找到就去上层查找,一直会查找到顶层作用域(全局---window)然后在查找过程中,我们把逐层向上的一层一层查找所构成的一个链条叫做作用域链(实际上是没有作用域链的,这是一个纯概念的东西)
变量的访问规则
变量访问会先在当前作用域内查找,找到拿来直接用,如果没有找到,会去上层作用域查找,找到直接用,如果上层作用域没找到,会继续去上层作用域的上层作用域查找,找到直接用,没找到会继续往上,如果找到全局作用域内还没有变量会直接报错 num is not defined
变量的赋值规则
变量赋值会先在当前作用域内查找,找到直接拿来赋值,如果没找到,会去上一层作用域查找,找到直接赋值,如果找到全局作用域内还没有找到变量,那么会直接将变量定义在当前作用域内(全局作用域)然后赋值
重点:作用域链只会向上查找,不会向下
二十一. 递归函数
在函数内部调用自身,此时就是写了一递归,但他是死递归 想要写一个正确的递归函数,需要在递归内部写上返回点(到某个条件时,停止递归)
例:function fn(n) {if(n == 1){return 1} return n * fn(n - 1) var sum = fn(4)console.log(sum) 值为24
二十二. 规律的数列
例:有一个数列 第一位和第二位固定为1
从第三位开始,每个位置的数字,是前两位的和
function fn(n) if (n==1 || n==2){return 1}
return 数列中第四位的值 + 数列中第三位的值 return 愤怒(n-1) + fn(n-2)
var sum = fn(5) console.log(sum)