作用域,变量,常量

1.新的两种变量声明方式

  • let 和 const
    通过var声明变量有几个小问题: 1.可以重复声明 2.不能定义常量 3.不支持块级作用域 4.变量提升,可以认为没有预编译

let不能重复声明:

let a = 1
let a = 2 //报错

块级作用域:

if(true){
  var b = 1
}
console.log(b) //b是1
-----------------------------------
if(true){
  let a = 1
}
console.log(a) //报错,a没有定义
--------------------------------------------
//以前的js只有两个作用域:全局作用域和函数级作用域
// let不会变量提升
let a = 2
{
  console.log(a) //报错,a没有定义,只有一个语句块的话,不会打印外部的a
  let a = 1
  console.log(a) //a为1
}
-------------------------------------------------------
//经典应用
for(var i = 0;i< 2;i++){
  setTimeout(function(){
    console.log(i) //打印 2 2,因为i是全局变量,事件循环后i已经变为2
  },1000)
}
-----------------------
for(let i = 0;i< 2;i++){
  setTimeout(function(){
    console.log(i) //打印 0 1,i是for循环内部的变量
  },1000)
}
//对应的es5代码
var loop = functiton(i){
  setTimeout(functtion(){
    console.log(i)
  },1000)
}
for(var i = 0;i< 2;i++){
  loop(i)
}
--------------------------------

定义常量:

const PI = 3.14 //不能重新赋值
PI = 5 //报错
-----------------------------------
//注意
const user = {name: '冰冰'}
user.name = 'jack' //不报错,user引用的地址不能修改,
//但是地址引用的堆内存数据可以修改
user = {name: '天天'} //报错,另开一块内存是不行滴

关于循环

for(let i =0; i < 5; i++) {
  ...
}

这里会形成5个块级作用域

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容