问老师一个问题
比如这样一个函数
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
function fn() {
var i = 1;
return function fn2(){
console.log(i);
};
}
fn()();
</script>
</body>
</html>
执行完红色框内时,得到的应该是箭头所指的函数,此时此刻再执行后面的(),它应该读取不到变量i才对,会报错。
但是为什么依旧能读取到最初fn中的var i = 1的赋值
36
收起
正在回答
3回答
同学你好,如下的理解都是不对的:


建议同学把自己的这些理解都丢弃,跟着老师的回复重新理解。另外,同学现在不懂的这些,有一部分比较深,所以老师简单的给你讲解一下,你固定记住就行。后面的课程也会涉及到一些。如果还不理解,建议先往后学习,等学到《面向对象》中的闭包会好理解一点。
具体参考如下:
一个普通的函数,调用它,会形成一个局部作用域。等他执行完毕,就会把它销毁了。例如如下函数会被销毁。

但是注意,函数内部变量如果还在使用中,是不会销毁的。这就是垃圾回收机制的特点,你固定记住就行。下面的例子中,fn调用形成一个局部作用域,但是fn2也在这个作用域里面(从代码结构中,fn2是在fn中定义的,所以fn2在fn作用域里面)。所以fn2肯定是可以拿到变量i去使用的。fn2使用到这个变量i,变量i就不会销毁。变量i就是临时存在内存里面(内存这个很抽象,我们不用去深究),等它彻底没有用了,才会被垃圾回收掉。fn调用完毕之后,又调用了fn2。fn2中使用到i,说明这个变量i还不是垃圾,所以并不会被销毁。(如果同学不理解,就直接记住,这都是规定的。)

祝学习愉快~





恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星