深入理解ES6--块级作用域(let const)

原创 2017年09月03日 23:19:12

var 声明及变量提升机制

var 的声明提升机制 —> 在函数作用域或全局作用域中通过关键字var 声明的变量,无论实际在哪里声明,都会被当成在当前作用域(ES5作用域,只有函数能起到块级作用域的目的)顶部声明的变量.
var 声明的变量会覆盖window的原有对象

var value;
if(true){
    //可以重复声明
    var value = 1;
}
//本应该只作用在if 花括号之内
console.log(value);//1;
var Math = 1; //window.Math === Math  true

ES6 的块级声明

let 声明

1.let 不能重复声明
2.只作用在当前代码块
3.声明的变量不会覆盖window 上面的变量

if(true){
    let value = 1;
}
console.log(value);//undefined;

let Math = 1; //window.Math === Math  false
/*带来的问题:
当你使用iframe去调用对象的时候.由于let 声明的变量不在window上面,
无法通过iframe调用,所以这种情况需要使用var来声明变量 */

const 声明

const表示声明的是常量,和let 一样也是块级作用域
1.const 不能重复声明
2.声明同时需要赋值
3.不能重复赋值
4.声明的是对象的话,可以修改对象的内容
5.声明的变量不会覆盖window 上面的变量

const val; // 语法错误,常量未初始化
const value = 1;
if(true){
    //作用域不同可以声明,let 可以置换为const
    let value = 1;
}
value = 2; //语法错误,不能重复赋值 

const obj = {};
obj.xx = "xx";//可以修改对象的内容
obj = 1;//错误,不能修改obj 的绑定

临时死区

用来描述let 和const 声明的变量不提升的效果

if(true){
    console.log(typeof value);//错误:value is not defined
    let value = 'val';
}

循环中的声明

    var funcs = [];
    for (var i = 0; i < 10 ; i++) {
        funcs.push(function(){
            console.log(i);
        })
    }
    funcs.forEach(function(v){
        v(); //输出 10次10,让新手很痛苦的问题,需要用闭包解决,在此就不赘述
    })

    var funcs = [];
    for (let i = 0; i < 10 ; i++) {
        funcs.push(function(){
            console.log(i);
        })
    }
    funcs.forEach(function(v){
        v(); //输出0,1,2,3,4,5,6,7,8,9
    })
    //const 的话会报错,再循环中,for(let i=0;i<10;i++)
    //相当于给 i 赋值10次,const 不能重复赋值所以报错

    for(const key in obj){
        //当const 遍历对象 ,循环迭代,不会报错
    } 
版权声明:本文为博主原创文章,未经博主允许不得转载。

初步探究ES6之let,const和块级作用域

我们知道javascript定义变量的方式是var,但是var有几个问题。var第一个就是作用域的问题,var不是针对一个块级作用域,而是针对一个函数作用域。举个例子:function runTowe...
  • mevicky
  • mevicky
  • 2015年11月13日 09:28
  • 4464

浅谈ES6 块级作用域

1、为什么需要块级作用域 ES5只有全局作用域和函数作用域,没有块级作用域,会带来以下问题: 1) 变量提升导致内层变量可能会覆盖外层变量; var i = 5; function func() { ...
  • zhouziyu2011
  • zhouziyu2011
  • 2017年03月30日 11:07
  • 984

javascript之块级作用域的概念和闭包

简单的块级作用域: javascript没有块级作用域的概念 function test(){ for(var i = 1 ; i ...
  • bq1073100909
  • bq1073100909
  • 2015年09月24日 08:44
  • 1392

js的函数作用域跟块级作用域

一,js中的作用域     js中除了全局作用域,还有函数作用域。     嗯,还有块级作用域。 二,函数作用域跟块级作用域的区别     当将代码看成一个IIFE时,全局作用域其实就是一个函数作用域...
  • huangjq36SYSU
  • huangjq36SYSU
  • 2016年04月07日 14:34
  • 3982

ES6之let、const和块级作用域

let、const和块级作用域
  • kaelyn_X
  • kaelyn_X
  • 2017年11月02日 23:27
  • 77

可怜的js居然没有块级作用域

js中一个for循环:for(var i=0;i
  • u012181244
  • u012181244
  • 2014年11月10日 11:22
  • 1224

let、const、var和块级作用域

我们知道JavaScript定义变量的方式是var,但是var有几个问题。var第一个就是作用域的问题,var不是针对一个块级作用域,而是针对一个函数作用域。 为了解决这些问题,ES6提出了l...
  • lilythy2016
  • lilythy2016
  • 2017年05月10日 16:58
  • 190

js中模仿块级作用域

js中没有块级作用域的概念,例如:function printNumber(num) { for(var i = 0; i < num; i ++ ) { co...
  • csdn_zsdf
  • csdn_zsdf
  • 2017年03月12日 11:59
  • 347

php坑系列之块级作用域

前言 代码: 输出 int(4) int(7) 为什么foreach 循环内的$val和$sum变量已经退出循环了,打印出来还是显示变量存在?原因是:PHP有函数作...
  • qq_35440678
  • qq_35440678
  • 2016年09月21日 20:32
  • 1708

ES6之块级作用域与函数声明--读书笔记

函数能不能在块级作用域之中声明?ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。// 情况一 if (true) { function f() {} } // 情况二...
  • Maxbyzhou
  • Maxbyzhou
  • 2017年06月26日 17:02
  • 451
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入理解ES6--块级作用域(let const)
举报原因:
原因补充:

(最多只允许输入30个字)