资讯专栏INFORMATION COLUMN

初入ES6-let和const以及代码块

wwolf / 1363人阅读

摘要:变量和常量的声明一般的声明,不在函数内就是全局变量,值可以是基本和引用值,可以随时修改和删除语法同一个作用域的声明,只要有同样的声明都会报错,只能修改值语法,和一样,但是不能更改值以上两个语法都不存在变量提升的效果直接使用的话,直接引用错误

变量和常量的声明

var a = 34;            //一般的声明,不在函数内就是全局变量,值可以是基本和引用值,可以随时修改和删除

let 语法,同一个作用域的声明,只要有同样的声明都会报错(Uncaught SyntaxError),只能修改值

let newa = 34;

const语法,和let一样,但是不能更改值;

const b = 34;

以上两个语法都不存在变量提升的效果;直接使用的话,直接引用错误;

console.log(newb);        //ReferenceError
let newb = 34;

TDZ 暂时性死区,只要在同一作用域内,包括函数和块级全局,let 和const 就会绑定在这个区域,在这之前使用的话,都会报错,直到声明过后

使用let和const或者var在块级作用域内,会把变量限定在代码块内,无法突破;

{
typeof g;        //ReferenceError
typeof v;        //ReferenceError
typeof d;        //undefined
let g = 34;
const v = 3;
var d = 4;
};
typeof g;        //undefined
typeof v;        //undefined
typeof d;        //undefined

需要注意的是const变量的值是引用值的话,引用值的指针不变,就可以添加属性和方法,但是不能从重新指定对象引用值

const obj  = [];//声明一个常量对象
obj.name = "obama"; //obama
obj.name = "bush"    //bush;
obj = {}    // typeError

使用大括号{}相当于声明了一个代码块,可以无限制嵌套{{{{ }}}},

全局对象,在ES5之前,全局属性和方法是属于window的属性和方法,使用,window.valiable,都访问到,但是在es6的语法里,虽然在在全局声明的变量和对象都可以直接访问,和之前还是有区别的

var a = 45;
let b = 23;
window.a   ->45;
window.b  ->undefined; 

循环函数

for(var i = 0 ;i<10 ;i++){
    console.log(i);
}
//顺序输出0,,,,,9;
//此时console.log(i) ->10;i为全局变量;
var arr = [];
for(var i = 0 ;i<5 ;i++){
        arr.push(function(){return i})
}
//此时arr数组里面有5个函数function(){return i };
//修改函数
for(var i = 0 ;i<5 ;i++){
    arr.push((function(i){return i})(i))
};
//执行
var i = 0;
arr.push();//此函数只会保存括号里的值,可以是任何值,函数也行,不一定是数值;
(function(){function(){return i})() //IIFE 此时的i值为0;输出0,不立即执行的话就是普通函数;
arr.push(0);//arr ->[0];
// .
// .
// .
 var i = 4;
arr.push();
(function(){function(){return i})() 
arr.push(4);//arr ->[0,1,2,3,4];
var i = 5;
i <5 //false;   

关于闭包,

为何let会保存原来的值??

var arr = [];
for(let i =0;i<5;i++){
    arr.push(function(){console.log(i)})
};

//每次迭代

{ let i = 0; arr[0] = function(){console.log(i)} }    //此时因为let绑定在块级作用域,注意此处的{ };i的值只能访问到 i = 0;无法突破作用域,得到其他的值,但是确记住了此时的i值,类似闭包函数,而且不会改变!!
{ let i =1; arr[1] = function(){console.log(i)} }    
{ let i = 2; arr[2] = function(){console.log(i)} }    
{ let i =3; arr[3] = function(){console.log(i)} }    
{ let i = 4; arr[4] = function(){console.log(i)} }    

//let 这样的行为,并不会报错是因为ES6语法针对for ,for-of for-in 特殊规范的,在其他地方,对同一个let 变量赋值的话,会报语法错误
let i = 0;
let i = 1    //报错

let和const对于在循环中新的绑定不会报错对const修改值会报错,但绑定不会

const arr = ["a","b","c"];
const obj = {
    name:"obama",
    age :73
}
for(let i = 0;i

let 和const在函数使用默认值的时候也有一些行为规则

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89017.html

相关文章

  • es6-let const

    摘要:声明的变量只在命令所在的代码块内有效使用命令声明的变量在解析的过程中不会被预解析也就是不存在变量提升了使用命令声明的变量会存在暂时性死区不同于全局变量不再是的属性了会报错出现了暂时性死区使用这个变量不允许再重复声明声明过的变量也不可以再使用 let 1、let声明的变量只在命令所在的代码块内有效2、使用let命令声明的变量在解析的过程中不会被预解析(也就是不存在变量提升了)3、使用le...

    xinhaip 评论0 收藏0
  • 初入ES6-解构

    摘要:允许按照一定的模式,从数组或者对象中取值,对变量进行赋值数组解构的对象要具有接口也就是可以遍历按照对应的关系进行取值如果解构不成功变量的值就是如果右侧的数值不是数组,就会报错注意字符串是可以遍历的也可以有默认值只要被赋值的变量不是严格就是默 ES6允许按照一定的模式,从数组或者对象中取值,对变量进行赋值 数组 var a = 2; var b = [1,2]; var c = this...

    FullStackDeveloper 评论0 收藏0
  • HTML & CSS之小白初入江湖

    摘要:之小白初入江湖超文本标记语言简称是一种用于创建网页的标准标记语言。描述了一个网站的结构语义随着线索的呈现,使之成为一种标记语言而非编程语言。是块级元素,是行内元素。层叠样式表简称是一种用来为结构化文档如添加样式的工具。 HTML & CSS之小白初入江湖 1. HTML 超文本标记语言(HyperText Markup Language, 简称HTML)是一种用于创建网页的标准标记语言...

    fai1017 评论0 收藏0
  • HTML & CSS之小白初入江湖

    摘要:之小白初入江湖超文本标记语言简称是一种用于创建网页的标准标记语言。描述了一个网站的结构语义随着线索的呈现,使之成为一种标记语言而非编程语言。是块级元素,是行内元素。层叠样式表简称是一种用来为结构化文档如添加样式的工具。 HTML & CSS之小白初入江湖 1. HTML 超文本标记语言(HyperText Markup Language, 简称HTML)是一种用于创建网页的标准标记语言...

    crossoverJie 评论0 收藏0
  • nodejs 初入--learnyounode课程总结(下)

    摘要:然而,这一次,将有三个作为前三个命令行参数提供。编写一个时间服务器服务器监听一个端口,以获取一些连接,这个端口会经由第一个命令行参数传递给程序。 learnyounode 13课总结(下) 前断时间较为忙碌,所以learnyounode的下半部分总结一直拖到了现在,罪过罪过。那么今天我就将8-13课的内容整理出来,将后半部分的知识稍微梳理一下。 这里推荐一篇learnyounode...

    shusen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<