近期学习心得记录,接下来的内容如果你之前也和我一样一知半解,那评论区留下你的剑~哈哈哈哈哈哈哈哈
好了,正题开始。
let , const 这两个关键字是ES6新增的,let,const 定义的变量会被束缚在{ }这样的代码块中,不会有变量提升,但是var 就存在变量提升。(嗯,之前知道了这个概念,但是不知道是个什么情况,下面我们来分析吧)
1.
<script>
console.log(a);
var a = 'hello?';
</script>
解释:var定义的变量被提升到了作用域顶部,如果一个变量只是定义了,但是没有给它初始值(a = ‘hello?’ 这句话没有被执行到,因此没有初始值),那么它的值就是undefined;这里想深入理解的话可以去学习JavaScript的编译和运行时。
2.
<script>
console.log(b);
let b = 'hi?';
</script>
解释:let 不存在变量提升,因此,b在定义它之前,你试图使用console.log()函数引用它,就会报引用错误。
3.
<script>
var tmp = 'out';
if(true){
tmp = 'in';
let tmp;
}
</script>
解释:同样是引用错误,因为代码在编译阶段确定了作用域,if(true)后面的{}花括号形成了一个块级作用域,因此,你试图在块级作用域中用let定义tmp之前给tmp赋值,就会报引用错误。
4.
<script>
const bar = 'bar';
let bar = 'cbar'
</script>
解释:这个就好理解了,const关键字定义的常量(bar)指向一个基本数据类型(‘bar’),那么它(bar)是不可改变的,同时也不允许重复声明。
扩展:但是const定义的常量指向的是一个对象类型,那么这个对象类型里面的值是可以改变的(涉及到JS的堆和栈,感兴趣的去看看呗~)。例如下面的代码
<script>
const obj = {
name : 'myc',
age : 22
}
console.log(obj)
obj.name = 'lpp'
console.log(obj)
</script>