在逛某论坛时无意间看到一个面试者的面试分享,let,const是如何实现的,当时看到也是一脸懵逼,后面自己静下心来想了一下
let
let命名的变量只在当前作用域及子作用域可以被访问 ,let实际是为javascript添加了一个块级作用域,所以用一个自执行函数包裹变量声明就可以实现
(function(){var a = 1;console.log(a)})();
console.log(a)//a is not defind
但是let声明的变量不存在变量提升,我想不出好的方法去实现
const
const用来声明一个常量,不可改变,我想到的方法是使用Object.freeze()方法
var f = Object.freeze({'name':'admin'});
f.name = 'hello'; // 严格模式下是会报错的
f.name; // 打印出admin ,值没有被改变
const实际上保证的是该常量所指向的栈内存中的数据不可改变,因此如果用const来声明一个引用数据类型,就无法保证引用数据类型所指向的堆内存中的数据发生改变
const a ={a: 'admin'};
a.name='xiaoming';
a.name // xiaoming;
所以再用const声明引用数据类型时要格外小心
总结
let,const 的加入使得javascript拥有了块级作用域,就不会向以前一样再if中声明的变量在外部也可以访问,而且变量在没有声明之前就无法访问,使得代码逻辑更加的清晰了