为何函数作用域内用var声明的变量不在window对象中?
变量仅存在于局部作用域却不在window对象的深层原因
出现这种现象,核心是JavaScript的作用域规则和变量声明方式导致的,具体原因分这几种:
- 块级作用域变量特性:如果
age是用let或const声明的,不管是在if/for这类代码块还是函数局部作用域里,这类变量都属于块级作用域,不会被挂载到全局的window对象上。只有var声明的全局变量,才会自动成为window的属性。 - 函数局部作用域隔离:只要
age是在函数内部声明的(不管用var/let/const),它就被限制在函数的局部作用域中,作用域链仅覆盖函数内部,不会向上渗透到全局作用域,自然不会出现在window对象里。 - ES模块的独立作用域:如果你的代码是通过
<script type="module">加载的ES模块,哪怕是在模块顶级作用域声明的变量,也不会挂载到window——模块有自己的独立作用域,和全局作用域是完全隔离的。 - 严格模式的限制:开启严格模式(代码顶部加
'use strict')后,意外创建的全局变量(比如直接写age = 18而不声明)不会成为window的属性,反而会抛出错误,从根源上避免了隐式全局变量的问题。
举个直观的例子:
// 函数局部作用域的let变量,不会出现在window function getAge() { let age = 28; } getAge(); console.log(window.age); // undefined // 全局var变量会挂载到window var globalAge = 30; console.log(window.globalAge); // 30
内容的提问来源于stack exchange,提问作者Rudra Gaur
相关产品推荐
相关产品推荐

