const name = "wangxiaoming";
name = "zhangsan";
console.log(name); //报错
const不可更改,执行第二条语句时报错,终止执行之后的语句
const config = {
url: "http://www.baidu.com",
port: 8080
};
config.port = 8081;
console.log(config); // {"url": "http://www.baidu.com", "port": 8081}
这里定义的是一个对象,可以直接修改对象里面的值。虽然用了const,但const保存的是一个地址(存在栈区中),而内容是存在堆区
var a = 10;
(function(){
console.log(a); //undefined
a = 5;
console.log(window.a); //10
var a = 20;
console.log(a); //20
})();
这里考察的知识点是作用域和变量提升。var a = 10;这是外部变量,下面是一个立即执行函数,属于一个函数作用域,正常情况里面的语句会直接使用外部var a,但函数内部也定义了a,所以不会再用外部的a
- 变量提升,所以第一个输出结果是undefined
- window.a 是用全局变量,所以输出10(最外层使用var定义变量时会挂载到window上,之后任意地方可引用,默认如果其他子作用域没定义相同变量,会直接向上查找,可以直接用a)
- 最后就是子定义域中的a,赋值打印,输出20
加深理解变量提升
这样理解:console.log(a);
a = 5;
console.log(window.a);
var a = 20;
console.log(a);
在 var a = *** 语句前面的地方使用了 a ,就都是undefined
- 变量的生成有3个部分:创建 初始化 赋值
- 代码执行有预解析,所以写完代码后,会把 var 提到最上面
- 单存的执行两个步骤 var a; a = undefined;这就是 创建 初始化
- 出现了 var a = *** 之后就是赋值了