为何在window.onload事件处理器中创建的实例无法全局访问?
问题出在哪?我来给你拆解清楚~
首先直接点破核心:你的代码里有两个关键误区,咱们一个个说透:
1. const是块级作用域变量,根本出不了window.onload函数
你用const testFirst = new First();声明变量,const(包括let)都是块级作用域的——简单说就是,这个变量只在它所在的函数/代码块里有效,出了window.onload这个函数,外面的Second构造函数根本“看不见”它。
哪怕你把const换成var,也一样没用!因为var是函数作用域的,只要是在函数内部用var声明的变量,依然是这个函数的局部变量,不会自动变成全局的(也就是不会挂载到window上)。
2. 你对window.onload的作用域理解错了
window.onload的回调函数确实是在window的上下文里执行的,但这并不意味着函数内部声明的变量会自动成为window的属性。只有当你显式把变量挂载到window上时,它才会变成全局可访问的,比如:
window.onload = function(){ window.testFirst = new First(); // 直接挂载到window对象上 const testSecond = new Second(); // 现在testFirst就能被正常访问了 }
额外补充:为什么你之前会误解?
你可能混淆了“全局作用域声明变量”和“函数内部声明变量”:如果在所有函数外面用var声明变量,那它会自动成为window的属性;但在函数内部不管用var/let/const声明的变量,默认都是局部的,和window上下文没关系。
如果想让testFirst在全局可用,除了上面挂载到window的方式,也可以在函数外面先声明变量:
var testFirst; // 在全局作用域提前声明 window.onload = function(){ testFirst = new First(); const testSecond = new Second(); }
这样testFirst就是全局变量,Second构造函数就能顺利访问到了。
内容的提问来源于stack exchange,提问作者Igor Cheglakov
相关产品推荐
相关产品推荐

