如何使用es5实现let,const

553 阅读1分钟

在逛某论坛时无意间看到一个面试者的面试分享,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中声明的变量在外部也可以访问,而且变量在没有声明之前就无法访问,使得代码逻辑更加的清晰了