函数中允许嵌套函数
函数作用域:全局作用域,局部作用域:
<script>
/*
作用域:一个变量可以使用,可以生效的范围。
作用域有2个:
1.全局作用域:直接书写在script标签中的变量,定义在全局作用域中的变量在任何一个地方都可以使用
2.局部作用域(私有作用域、函数作用域):在js中只有函数才可以生成局部作用域
我们的变量定义在哪个位置他的作用域就在哪里
有了作用域变量就必然会有自己的使用范围(使用规则)
关于变量的使用规则:变量的访问规则、变量的赋值规则。
研究规则之前,需要先搞清除:什么叫定义,什么叫访问,什么叫赋值。
定义:变量写了var了,就叫做定义
var a;====是定义,定义了一个名字叫做a的变量
a = 10;===是赋值,把10的值赋值给a了
console.log(a);==是访问,尝试获取到a的值
var b = 100;===有定义也有赋值,先定义一个b,再对b进行赋值。
*/
var a = 10//全局作用域(全局变量)
function fn() {
var b = 20//局部作用域(局部变量)
console.log(a);
}
fn()
</script>
js变量的访问规则,赋值规则:
当我想获取一个变量的值的时候,我们管这个行为叫做 访问:
变量访问规则:局部访问,没有,就往上访问,直到全局也没有,代码报错
当你想给一个变量赋值的时候,那么就先要找到这个变量,在给他赋值:
变量赋值规则:局部访问,没有,就往上访问,直到全局也没有,就会把这个变量自动定义为全局变量
<script>
/*
变量的访问规则:
访问的时候先再自己的作用域中看有没有该变量,有就使用,没有就去到上一层作用域中找,如果上一层中有就使用
如果没有继续向上找,知道找到全局为止,如果全局依然没有,代码就报错。
eg:
*/
var num = 100
function fn() {
var num2 = 200
function fun() {
var num3 = 300
console.log(num3) // 自己作用域内有,拿过来用
console.log(num2) // 自己作用域内没有,就去上一级,就是 fn 的作用域里面找,发现
有,拿过来用
console.log(num) // 自己这没有,去上一级 fn 那里也没有,再上一级到全局作用域,发现
有,直接用
console.log(a) // 自己没有,一级一级找上去到全局都没有,就会报错
}
fun()
}
fn(
/*
要想给一个变量赋值,首先要先找到这个变量才能完成赋值操作
变量的赋值规则:
先在自己的作用域中找该变量,能找到,就赋值,找不到,就去上一层找,上一层作用域有,就给上一层完成赋值操作
如果上一层依然没有,就继续一层一层往上找,直到全局为止,如果全局依然没有,那么就把这个变量自动定义成全局
eg:
*/
function fn() {
num = 100
}
fn()
// fn 调用以后,要给 num 赋值
// 查看自己的作用域内部没有 num 变量
// 就会向上一级查找
// 上一级就是全局作用域,发现依旧没有
// 那么就会把 num 定义为全局的变量,并为其赋值
// 所以 fn() 以后,全局就有了一个变量叫做 num 并且值是 100
console.log(num) // 100
</script>
(了解即可)递归:递归就是一个自己调用自己的手段,和循环类似
<script>
/*
斐波那契数列数列:1 1 2 3 5 8 13 。。。
规律:第一个数字和第二个数字永远为1
从第三个数字开始:是前面2个数字相加之和
利用递归求出第n项的数字?假设我想求第10个数字,我们就要知道第9个和第8个数字
一直往前问,递归的思想
写递归的技巧:
先写一个函数
在函数写结束函数的条件(不往下问的条件)
找往下问的规律:求第n项,应该是前面2个数字相加之和
也就是n的数字 = (n-1)+(n-2)
返回值规律 return fn(n-1)+fn(n-2)
*/
function fn(n) {
if (n == 1 || n == 2) {
return 1
}
return fn(n - 1) + fn(n - 2)
}
var res = fn(8)
console.log(res);
</script>