提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、LET 和 VAR
- @1 变量提升: let不存在变量提升、而var是具备变量提升的
console.log(n); //Uncaught ReferenceError: Cannot access 'n' before initialization 词法分析阶段,我们就知道未来在全局上下文中会基于let声明一个n的变量,所以此时报错是:不允许在声明之前使用他...
console.log(m); //undefined
let n = 10;
var m = 20;
注 :在所有操作之前,首先要进行的第一个操作”词法分析“ 生成词法解析树 AST,我们就知道未来在全局上下文中会基于let声明一个n的变量,所以此时报错是:不允许在声明之前使用他…
- @2 重复声明:
let不允许重复声明「当前上下文中,不论当前变量基于何种方式声明过,都不允许再用let声明了」,一但重复声明,AST词法阶段都过不了,啥代码都不会执行;var不会重复声明,但是不会报错;
// 在词法分析阶段报错 Uncaught SyntaxError: Identifier 'n' has already been declared
console.log('OK');
let n = 10;
var n = 20;
- @3 和GO的关系:
在全局上下文中,基于var/function声明的变量是放在GO中的「可以基于window.xxx去访问、也可以直接获取」;但是基于let/const声明的变量是放在VO(G)中的,和GO没关系!!
function(){
let a = 1
var b=2
}
//此时的a b都是当前上下文中得私有变量
-
@4 块级上下文:
在除函数/对象的大括号外,如果括号中出现let/const/function会产生块级私有上下文,而且声明的变量也是块中的私有变量;但是var既不会产生块上下文,块上下文也不会对其产生影响!! -
@5 暂时性死去问题
console.log(typeof n); //undefined 基于typeof检测一个未被声明的变量,结果不会报错,而是“undefined”
console.log(typeof n); //Uncaught ReferenceError: Cannot access 'n' before initialization
let n = 20;
二、LET 和 CONST 的区别
LET声明的是变量「对」
CONST声明的是常量「不准确」:CONST声明的也是变量,只不过不允许重新关联其它的值(不允许指针重新指向)
代码如下(示例):
const obj = {
name: 'zhufeng'
};
obj.name = '哈哈哈';
console.log(obj);