三种变量声明很常见,就来说点不一样的
- 原来还有全局对象和顶层对象
- 为什么我定义的变量和函数无法delete
刚接触js时,声明一个变量会用var或者function,共2种
- var声明的全局变量
- var在函数范围内声明的局部变量
- eval中声明的全局变量。
在es6中,新增了let/const/import/class,共6种
顶层对象
浏览器环境中顶层对象是window,Node中是global对象
- ES5中,顶层对象的属性等价于全局变量
- ES6中,var、function声明的全局变量属于顶层对象,其他4个则不属于顶层对象
,所以es6中的全局变量和顶层对象的属性分离。
1 | var b = 2; |
1 | let len = 10; |
注:
- arguments.length表示传入函数的实参数量
- 函数本身的length属性代表的是函数定义时给出的参数个数
变量删除
- var全局声明的变量是无法删除的,configurable=false
- var函数作用域内声明的变量是无法删除的,没有依赖的父对象
- eval()会创建属性,configurable=true,所以可以删除
同理,函数也是对象,声明的函数也会遵循var的方式,判断是否可以删除
1 | var a = 1; |
所以如果要删除已定义的变量,可以赋值覆盖掉它,或者是在局部作用域中创建,等待内存回收
垃圾回收有2大条件
- 未被引用的对象会被自动回收
- 不可访问的对象会被自动回收,比如虽然2对象互相引用,但是外部不可访问也会被回收