2019-03-03

es6 第二章 let和const命令

let

基本用法

  • let和var的区别

    • let:只在定义的代码块中起作用
    • var:在代码块外也有定义
      { 
       let a=10;
       var b=2; 
     }
     a//undefined
     b//1
    
    • let 适用于for循环得计数器,只在for循环代码块中有定义,for循环外部无定义。
      而var的缺陷:在全局范围内有定义,也就是只能定义一个i,其他的i都是基于第一个
      定义的i进行操作的。
    • for循环中设置循环变量的那部分是父作用域,循环内是子作用域,为不同作用域,值可以不同,取决于子作用域的操作。
  • 不存在变量提升
    let:必须先声明后使用,否则会报错。
    var:无声明使用会输出undefined

  • 暂时性死区

    • let:变量未声明之前,都是变量的死区,即在死区使用都会报错
  var tmp =123;
    if(true){
        tmp="abc";
        let tmp ;
}
//ReferenceError: tmp is not defined
  • 隐藏性死区:变量值为另一个未声明的变量

     function bar(x=y,y=2){
         return[x,y];
      }
      bar(x=y,y=2);
      //ReferenceError: y is not defined
    
     function bar1(y=2,x=y){
         return[x,y];
         
     }
     bar1();
     //[2,2]
    
    • 暂时性死区的本质:只要进入当前作用域,变量存在但是不可以获取,只有出现声明后才能使用
  • 不允许重新声明

  • let不允许在同一作用域内重复声明同一变量,也不可以在函数内部重复声明参数,除非声明的参数在函数内部的一个新的代码块内。

块级作用域

  • es5只有全局作用域和函数作用域,没有块级作用域的不合理场景:
    1. 内层变量覆盖外层变量
    var tmp = new Date();
    function f(){
       console.log(tmp);
       if(false){
          tmp="hello world"
       }
    }
    //undefined
    
    1. 用来循环的计数变量变为泄露的全局变量
     var s="hello";
     for(var i=0;i<s.length;i++){
        console.log(s[i]);
     }
     console.log(i);
     //5
    
  • es6的作用域有三种:全局、函数、块级(let)
    • 块级作用于可以任意层嵌套,外部无法引用内部的变量,内部可以定义与外层同名的变量
 {{
    let s="hello";
    {let s=2}
 }}   
  • 块级作用域与函数声明
    • es6支持在块级作用域声明函数;
    • es6函数声明类似var,即会提升到全局作用域或者函数作用域的头部;
    • 同时,函数声明提升到块级作用域。
    • 块级作用域必须要在一个大括号内。

const

基本用法

  • 定义:const是一个只读的常量,一声明不许改动,而且必须初始化
const pi=3.14
pi=3;
pi//TypeError: Assignment to constant variable.
const p;
//SyntaxError: Missing initializer in const declaration.
  • 性质:

    • 只在声明的块级作用域有定义
    • 不允许重复定义;
    • 存在暂时性死区
    • 常量不提升
  • 本质:

  • 不是变量不可以改变,而是变量指向的内存空间所保存的数据不可以改变。

  • 对于简单数据类型(布尔值、字符串、数值),保存的数据就是值,所以不能改动;

  • 对于对象和数组,所指向的内存地址保留的是一个指针,指针所指向的数据结构是有可能可以改变的

const foo={};
 foo.name="Lucy";
 foo.name;//"Lucy"
 foo={}//报错  
  • 冻结对象以及属性的函数
var constantize = (obj) => {
 Object.freeze(obj);
 Object.keys(obj).forEach( (key, i) => {
   if ( typeof obj[key] === 'object' ) {
     constantize( obj[key] );
   }
 });
};

es6变量声明的方法

  • 六种:var和function;let和const;import和class.

顶层对象的属性

  • 浏览器的顶层对象是window,Node的顶层对象是Global
  • es5的顶层对象可以是全局变量
  • es6中规定:var和function定义的变量可以和顶层对象挂钩;但是const和let不允许。

Global对象

  • 获取global对象的方法:
 // 方法一
      (typeof window !== 'undefined'
         ? window
         : (typeof process === 'object' &&
            typeof require === 'function' &&
            typeof global === 'object')
           ? global
           : this);
      
      // 方法二
      var getGlobal = function () {
        if (typeof self !== 'undefined') { return self; }
        if (typeof window !== 'undefined') { return window; }
        if (typeof global !== 'undefined') { return global; }
        throw new Error('unable to locate global object');
      };
  • 在所有的环境中获取global对象:

         // CommonJS 的写法
           require('system.global/shim')();
           
           // ES6 模块的写法
           import shim from 'system.global/shim'; shim();
  • 将顶层对象放进global对象中:
      // CommonJS 的写法
       var global = require('system.global')();
       
       // ES6 模块的写法
       import getGlobal from 'system.global';
       const global = getGlobal();

参考文献

ECMAScript 6 入门--阮一峰

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容