console.log() (1)

506 阅读2分钟
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 = *** 之后就是赋值了

关于let

通常能百度到的都是var可以变量提升,let不可以 但其实let也可以,只是存在提升的层级问题