脚本执行完毕后,如何在浏览器控制台访问全局变量与函数?
为什么JS程序执行完后还能在控制台访问全局变量/函数?
这个问题的核心是混淆了调用栈的执行上下文生命周期和全局作用域的生命周期,拆解来看:
全局执行上下文(GEC)从调用栈弹出,只是表示程序的同步执行流程结束,并不等同于全局作用域被销毁。调用栈的作用是管理代码的执行顺序,执行完毕弹出是正常的流程收尾,但全局作用域的生命周期是和宿主环境绑定的。
在浏览器环境中,全局作用域的载体是
window对象——所有全局声明的变量、函数,都会自动成为window的属性或方法。只要当前页面没有被卸载(比如关闭标签页、刷新页面),window这个宿主对象就会一直存在于内存中,不会被垃圾回收机制清理。浏览器控制台本质上是在当前页面的全局作用域下运行代码的,所以你在控制台输入全局变量名或函数名时,其实是在访问
window对象上对应的属性,自然能拿到之前声明的内容。
举个简单例子验证:
// 全局声明变量和函数 var globalVar = "hello"; function globalFunc() { return "world"; }
程序执行完后,在控制台输入window.globalVar或直接globalVar,都会返回"hello";输入globalFunc()则会返回"world"——因为这些内容一直挂载在window对象上。
只有当你关闭当前页面或者刷新时,浏览器才会销毁window对象,此时全局变量和函数才会被释放内存。
内容的提问来源于stack exchange,提问作者Prajval Gahine
相关产品推荐
相关产品推荐

