一、作用域
作用是有使用区间的,变量不是说明之后在哪里都可以用,他有一个使用的范围,我们把这个范围叫做 作用域
二、作用域的分类
1、全局作用域:
-
JS给我们提供了一个叫做window的全局作用域,可以理解为 整个script标签内的作用域,就是全局作用域
-
全局变量都会挂载到 window 对象上
var num=100 var aaa=10000 /* 根据规则,这里是script标签内部,所以是全局作用域,我这个num */ //console.log(num) //100 //console.log(aaa) //10000 var name="千锋" //因为全局作用域window 上有一个属性叫name,所以我们的全局变量,要避 //免起名的时候叫做name,尤其是开发的时候 console.log(window)
2、局部作用域
-
在JS中,有且只有函数能够创建,局部作用域(函数作用域),局部作用域开始何结束位置,就是函数代码段开始和结束的位置
-
在局部作用域(函数作用域)内,声明的变量叫做局部变量
-
局部变量,不会挂载到window对象上
function fn(){ var num=100 console.log(num) //100 console.log(window)// }
二、什么是作用域链
1、变量的访问规则
变量访问会,现在当前作用域内查找,找到拿来直接用,如果过没有找到会去上层作用域查找;
如果上层作用域没找到,会继续上层作用域 的上层作用域内查找
var num=100
function fn(){
function fn1(){
console.log(num)
}
fn1()
}
fn()
/*
首先在fn1 这个作用域内 访问变量
会在当前作用内查找num变量,如果访问不到,则返回上一层作用域查找
在fn 这个作用域内 访问变量 如果有则直接使用,没有返回上一层作用域
最后,在全局变量中,访问变量,查找变量num 找到了 num=100
故此,打印100
*/
2、 变量的赋值规则
-
变量赋值会先在当前作用域内查找,找到了直接拿来的赋值,如果没有,会去上层作用域内查找,找到了直接赋值;
-
如果上层作用域也没有找到,会继续区上层作用域 的啥高层作用域内找找,找到了直接赋值,没找到继续网上
-
如果找到了全局变量内,还是没有找到变量,那么会直接将变量定义为在当前作用域内(全局作用域),然后赋值
function fn() { function fn1() { num = 1000; } fn1() } fn() console.log(num) /* 首先访问 fn1这个作用域,给变量num赋值 那么会在当前的作用域查宅 */
- 在查找变量时,会在当前作用域,找到就用,就没找到上层找找,一直会查找到顶层作用域,(全局--window)
- 然后查找过程中,我们把逐层向上的一层一层查找,所构成的一个链条,叫做作用域链(实际是没有作用域链的,这是一个纯概念的东西)
- 注意: 作用域链只会向上查找,不会向下
三、递归函数
-
在函数内部调用自己,调用自身。此时就是写了一种递归,但是死递归
-
要想写一个正确 的递归函数,需要在递归内部,写上,返回点(到某个条件是,停止递归)
function fn(){ if(满足条件){ fn() } if(不能满足条件1,满足条件2){ //结束递归函数 } }
斐波那契数列
-
数列:1 1 2 3 5 8 13 21 34 55...
-
规则:前两位必须是1 ,从第二位开始,每一位是前两位的和
function fn(n){ if(n ==1 || n==2){ return 1 } return fn(n-1) + fn(n-2) } var num=+prompt("请输入一个数字") var sum=fn(num) console.log(sum);