作者回复: 分析步骤很详细 👍
作者回复: 分析的没问题
作者回复: 分析的没问题 很赞
作者回复: 很高兴终于有人提这个问题了,我的观点是不要太纠结于概念,因为如何定义闭包不会影响到实际的使用,了解闭包是如何产生的,这才是本质的东西。
作者回复: 第一个我的疏忽,图明天改正过来。
第二个问题:当闭包函数执行结束之后,执行上下文都从栈中弹出来,只不过被内部函数引用的变量不会被垃圾回收,这块内容要到讲v8 GC那节来讲了。
第三个没明白意思
第四个是 只包含用到的变量,这是因为在返回内部函数时,JS引擎会提前分析闭包内部函数的词法环境,有引用的外部变量都不会被gc回收。
作者回复: 分析的没问题,你把闭包的概念外延扩大也没问题,分析思路很赞
作者回复: 是的 编译阶段就确定了
作者回复:
这个问题我在前面回答过一次了,重新贴下:
ES规定函数只不能在块级作用域中声明,
function foo(){
if(true){
console.log('hello world');
function g(){ return true; }
}
}
也就是说,上面这行代码执行会报错,但是个大浏览器都没有遵守这个标准。
接下来到了ES6了,ES6明确支持块级作用域,ES6规定块级作用域内部声明的函数,和通过let声明变量的行为类似。
规定的是理想的,但是还要照顾实现,要是完全按照let的方式来修订,会影响到以前老的代码,所以为了向下兼容,个大浏览器基本是按照下面的方式来实现的:
function foo(){
if(true){
console.log('hello world');
var g = function(){return true;}
}
}
这就解释了你的疑问,不过还是不建议在块级作用域中定义函数,很多时候,简单的才是最好的。
作者回复: 这是预分析过程,主要是查看内部函数是否引用了外部作用域变量,用来判断是否要创建闭包,所以预分析过程并不是编译过程!
作者回复: 分析没问题,不过es6已经不用ao了,这块知识可以更新下了
作者回复: 嗯,词法作用域是关键
作者回复: 加油,词法作用域影响到作用域链,这点很关键
作者回复: 都是静态的,动态绑定的this下节内容讲,this系统和作用域链是两套不一样的系统