飞雪连天射白鹿,笑书神侠倚碧鸳

0%

js中var/let/const的区别

三种变量声明很常见,就来说点不一样的

  • 原来还有全局对象和顶层对象
  • 为什么我定义的变量和函数无法delete

刚接触js时,声明一个变量会用var或者function,共2种

  • var声明的全局变量
  • var在函数范围内声明的局部变量
  • eval中声明的全局变量。

在es6中,新增了let/const/import/class,共6种


顶层对象

浏览器环境中顶层对象是window,Node中是global对象

  • ES5中,顶层对象的属性等价于全局变量
  • ES6中,var、function声明的全局变量属于顶层对象,其他4个则不属于顶层对象
    ,所以es6中的全局变量和顶层对象的属性分离。
1
2
3
4
var b = 2;
console.info(window.b); // 2
let c = 3;
console.info(window.c); // undefined
1
2
3
4
5
6
7
8
9
10
11
12
13
let len = 10;
function fn() {
console.info(this.len)
}
fn(); // undefined,此时this为window
let Person = {
len: 5,
say: function() {
fn(); // undefined 此时this为window
arguments[0](); // undefined 此时调用fn方法,arguments对象里没有len属性
}
}
Person.say(fn);// this为Person

注:

  • arguments.length表示传入函数的实参数量
  • 函数本身的length属性代表的是函数定义时给出的参数个数

变量删除

  • var全局声明的变量是无法删除的,configurable=false
  • var函数作用域内声明的变量是无法删除的,没有依赖的父对象
  • eval()会创建属性,configurable=true,所以可以删除

同理,函数也是对象,声明的函数也会遵循var的方式,判断是否可以删除

1
2
3
4
5
6
7
8
9
10
var a = 1;
console.log(Object.getOwnPropertyDescriptor(window, 'a')); // delete b => false

b = 2; // delete b => true

function aa(){} // delete aa => false
(()=>{
function bb(){};
return delete bb; // false
})()

所以如果要删除已定义的变量,可以赋值覆盖掉它,或者是在局部作用域中创建,等待内存回收

垃圾回收有2大条件

  • 未被引用的对象会被自动回收
  • 不可访问的对象会被自动回收,比如虽然2对象互相引用,但是外部不可访问也会被回收
听说,打赏我的人最后都找到了真爱
↘ 此处应有打赏 ↙
// 用户脚本