1.基本概念
闭包指有权访问另一个函数作用域中变量的函数
1.作用域
1.某一个函数体内的变量:
局部变量(函数外部无法访问,函数内部可以访问):使用var、let、const修饰的变量,在函数开始时会创建局部变量,在函数完成时会删除它们。
全局变量(函数外部可以访问):不使用关键字修饰
<script type="text/javascript">
//在函数外使用var关键字声明变量test_var1
var test_var1 = "变量1";
//定义函数testFun
function testFun() {
//在函数中定义变量没加任何关键字的变量test_var2
test_var2 = "变量2";
//函数内使用var关键字定义的test_var3
var test_var3 = "变量3";
}
//函数执行
testFun();
alert(test_var1 + "\n" + test_var2); //执行
alert(test_var3); //不执行
</script>
<script type="text/javascript">
//定义函数testFun
function testFun() {
//函数内使用var关键字声明变量test_var
var test_var1 = "1";
//if代码块
if (test_var1 == "1") {
//定义变量test_var2
var test_var2 = 10;
//for代码块
for (var i = 0; i < 5; i++) {
//打印输出i
document.write(i);
}
}
//在if块外访问test_var2
alert(test_var2); //正常输出
//在循环体外访问i
alert(i); //输出上面的i为5,因为var定义的i的作用域是整个函数
}
//函数执行
testFun();
</script>
如果上述的i是以let声明,则下面的alert(i)会输出undefined
<script type="text/javascript">
//循环体
for(let v = 0;v < 5;v++){
//在循环体内输出v
console.log(v);
}
//在循环体外输出v
console.log(v); //输出unidenfied
</script>
可以看到在循环体外不能访问循环体内定义的变量。
2.某一个函数体外的变量:
全局变量(该函数内部也可以访问):在 HTML 中,全局作用域是 window。所有全局变量均属于 window 对象。全局变量(或函数)能够覆盖 window 变量(或函数),任何函数,包括 window 对象,能够覆盖您的全局变量和函数,所以尽量不要创建全局变量。
局部变量(该函数内部不可以进行访问):函数外var修饰的
<script type="text/javascript">
//在函数外使用var关键字声明变量test_var
var test_var = "函数外的test_var";
//定义函数testFun
function testFun() {
//打印输出test_var
document.writeln(test_var + "<br>"); //输出undefined
//函数内使用var关键字定义的test_var
var test_var = "函数内的test_var";
//再次打印输出test_var
document.writeln(test_var + "<br>"); //输出函数内的test_var
}
//函数执行
testFun();
</script>
document.writeln(test_var + "<br>");输出undefined是因为变量提升机制
下面的var test_var = "函数内的test_var";会导致上面产生一个var test_var ,所以最终输出undefined
用let来避免变量提升机制
2.执行上下文
juejin.cn/post/684490… juejin.cn/post/708821…
执行上下文 看作是当前代码执行的一个环境与作用域。换句话说,当我们启动程序时,我们从全局执行上下文中开始。一些变量是在全局执行上下文中声明的。我们称之为全局变量。