ES6--入门

一.什么是ES6

ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版。

ES6 主要是为了解决 ES5 的先天不足,比如 JavaScript 里并没有类的概念,但是目前浏览器的 JavaScript 是 ES5 版本,大多数高版本的浏览器也支持 ES6,不过只实现了 ES6 的部分特性和功能。

二.Es6语法

1.变量 

ES6之前声明变量有两种方式 var 和 function ,还有一种隐藏的变量,函数的形参,即函数的私有变量; 

ES6提供的四种声明变量的方式:let , const , Class ,  import

(1)var定义的变量

    作用:有变量提升但不定义赋值,还给window提供了一个对应的属性

(2)function定义的变量

    作用:提前声明并同时定义赋值,这种叫做函数提升

    函数的参数默认值:

    ①写法上 有默认值的写后面,没默认值的写前面

    ②如果传对应的参数,就不要默认值了,不是先传默认参数,再用实参覆盖

(3)let定义变量

    作用:不存在变量提升,在声明前不能使用,不能重复使用,也不会给window添加一个属性

2.作用域

作用域分为全局作用域和局部作用域;全局:window下声明的变量及函数外声明的变量都在全局作用域下运行;局部:函数内声明的变量都在局部作用域下运行。

浏览器的运行机制:浏览器在执行时会生成一个全局环境叫做window,window分为两个模块,栈和堆,栈是存放变量的内存地址。堆用来存放代码块,然后浏览器

(1)var的作用域

   window下所有的var,在if条件中,不管if语句中的条件成立不成立,都有变量提升

//在window下的var都有变量提升

var a=true; console.log(b) //undefined if(a){ var b=123; }

  

(2)function

        function声明的变量会给window添加一个属性,属性值是方法

  函数的归属问题:跟在哪儿调用的无关,跟在哪儿定义的有关

//函数归属问题

var a=56; function fn(){ var a=12; return function ff(){ console.log(a) } } var ff=fn();
ff()

  函数在if语句中的特殊情况:只提前声明但是不定义,只有条件成立了,if语句中的所有函数都会在第一时间被定义,然后再执行if语句中的其他代码

    var a=true;
    console.log(ff)    //undefined
    if(a){
        console.log(ff)    //函数ff
        function ff(){
            console.log(111)
        }
    }
    console.log(ff)  //函数ff

(3)let的作用域 ES6提供了一种叫做块级作用域的概念

   块级作用域运用于在if条件语句 for循环语句和对象,只有let 和 const有块级作用域的个概念 ,但是var没有

  ①在块级作用域下,var和function没有作用,在块级中的function在块级前是只声明未定义的,但是在块级作用域中第一时间被定义

  ②在块级作用域中,let和const声明的变量是私有的,外面访问不到

  ③for循环下,let声明的变量不会泄露

  

//用var 写事件,在浏览器中事件都是异步的,当事件执行的时候,for循环也执行完了
所以每次点击都会输出 3

for(var i=0;i<btns.length;i++){
   btns[i].onclick=function(){
        alert(i)
    }
 }

用let的话 let声明的变量不会泄露 会正常输出 0 1 2
 for(let i=0;i<btns.length;i++){
     btns[i].onclick=function(){
         alert(i)
    }
 }

  ④块级作用域和对象该如何区分

  {}前面什么都不加的就是块级作用域  对象的话一定要将{}赋值给一个变量

{
        a:"hahah",
        b:123
    }

//Uncaught SyntaxError: Unexpected token :  
//会报错


console.log({
    a:"hahah",
    b:"dbhcb"
})


//给{}加一个()就好了 

  ⑤暂时性死区:块级作用域中只要存在let或const命令,就绑定了整个块级作用域,凡是在声明前使用变量,都会报错

  ⑥var a=a; 和 let a=a;  js中的赋值是从右往左,因为var有变量提升,所以不报错;但是Let没有变量提升 所以会报错

  ⑦块级作用域中 子可访问父的变量

{
       let  a= 5;
       {  console.log(a)   }  // 5


}

  

原文地址:https://www.cnblogs.com/qinlinkun/p/11139111.html