变量作用域
变量根据作用域的不同分为两种 :全局变量和局部变量
1 函数内部可以使用全局变量
2 函数外部 不可以使用局部变量
3 当函数执行完毕 本作用域 的局部变量会销毁
什么是闭包
闭包(closure) 指 有权 访问 另一个函数作用域中变量的 函数
简单理解就是 一个作用域可以访问另外一个函数内部的局部变量
闭包的主要作用 延伸了变量的 作用范围
<script>
// 闭包 :fun 这个函数作用域 访问了另外一个函数 fn里面的局部变量num
// 闭包的主要作用 延伸了变量的 作用范围
function fn() {
var num = 10
function fun() {
console.log(num);
}
fun()
}
fn()
</script>
闭包应用
<body>
<ul class="nav">
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
var lis = document.querySelector('.nav').querySelectorAll('li')
// for (var i = 0; i < lis.length; i++) {
// lis[i].index = i
// lis[i].onclick = function () {
// console.log(this.index);
// }
// }
// 利用闭包方式 获得当前li 索引号
for (var i = 0; i < lis.length; i++) {
// 利用for循环创建4个立即执行函数
//立即执行函数也成为小闭包 因为立即执行函数里面任何一个函数都可以使用它的i 这个变量
(function (i) {
// console.log(i);
lis[i].onclick = function () {
console.log(i);
}
})(i)
}
</script>
</body>
递归
-
如果一个函数内部可以调用其本身 那么这个函数就是递归函数
-
简单理解就是 函数内部自己调用自己 这个函数就是递归函数
-
递归的作用和循环效果一样
-
由于递归很容易发生 栈溢出 错误 所以必须要加退出条件 return
//递归 函数 自己调用自己 function fn() { fn() } fn() //超出最大调用堆栈大小
超出最大调用堆栈大小
<script>
// 递归 函数 自己调用自己
// function fn() {
// fn()
// }
// fn()
var num = 1;
function fn() {
console.log('递归函数要加 return');
if (num == 5) {
return;// 递归里面 必须加退出条件
}
num++
fn();
}
fn();
</script>