zoukankan      html  css  js  c++  java
  • Es6学习指南-1-函数变量

    本篇章我们简述的是 es6初级知识点,认识es6,以及es6变量和es5的变量和函数。

    ECMAScript  6简介

      ECMAScript 6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

    ECMAScript和JavaScript的关系

    一个常见的问题是,ECMAScript和JavaScript到底是什么关系?

    一个常见的问题是,ECMAScript和JavaScript到底是什么关系?

      要讲清楚这个问题,需要回顾历史。1996年11月,JavaScript的创造者Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这种语言能够成为国际标准。次年,ECMA发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript,这个版本就是1.0版。

      该标准从一开始就是针对JavaScript语言制定的,但是之所以不叫JavaScript,有两个原因。一是商标,Java是Sun公司的商标,根据授权协议,只有Netscape公司可以合法地使用JavaScript这个名字,且JavaScript本身也已经被Netscape公司注册为商标。二是想体现这门语言的制定者是ECMA,不是Netscape,这样有利于保证这门语言的开放性和中立性。

      因此,ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现(另外的ECMAScript方言还有Jscript和ActionScript)。日常场合,这两个词是可以互换的。

    以上是对Es6和javaScript的了解,现在我们正式开始学习Es6

    1.我们先了解es5的一些知识

    1.变量

    Es5声明变量的方式有哪些?

    一共有三种:

      第一是:var

      第二是:function

      第三是:我们需要注意 不能忽略函数的形参(形参也是变量它是函数的私有变量)

    var 定义变量

    var 有个功能是变量提升但是不能定义 给window 添加一个对应的属性。

    声明和定义是两码事

    定义是  =  号赋值

    function 既可以提前声明,同时还定义了

    什么是定义?

      所谓定义就是给变量赋值了

    作用域问题:

    var 的作用域

    怎么理解  域  这个词?

      域是范围的意思

    什么是全局作用域?

      在window下声明的变量或者在函数外声明的变量

    什么是局部作用域?

      在函数内声明的变量

    想学习作用域,必须了解浏览器执行的机制:

      浏览器在执行时候会开辟一个大空间(window) ,window下面分两个模块,栈内存(执行模块,栈内存也叫作用域),堆内存(也叫存储模块)。栈内存用来存放变量的内存地址,堆内存主要存放代码块的,然后浏览器从上到下执行代码。

    function 声明的变量

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

    下面我们说一下函数的归属问题:

      1.函数归属谁跟它在哪调用无关,跟在那定义有关

    //函数归谁,跟它在哪调用无关,跟它在哪定义有关。
        var a=10;
        function fn(){
            var a=12
            return function(){
                console.log(a)
            }
        }
        
        //ff()是fn中的匿名函数
        var ff=fn()
        ff()//12

    2.任何一个函数都有返回值,如果写了 return return返回什么就是什么,如果没有写return 得到的是undefined

    //任何一个函数执行后都有一个返回值,如果写了return return的是什么就得到什么,
    //如果没有return得到的是undefined
    //如果是我把return a 给删掉 那么console.log(a)打印的是undefined
        function fn(){
            var a=20;
            return a
        }
        console.log(fn())

    对于变量来说 它的作用域只有 window和函数(函数执行时会开辟一个私有作用域)

    3.函数在if中的特殊情况:

      在if语句中定义的函数(很特殊),只声明不定义,当条件成立的时候,if模块中不管函数在哪声明的函数,都会第一步对这个函数定义,再去执行if里面的代码

    //函数在if中的特殊情况
        var a=12;
        console.log(fn)//undefined
        if(a){
            console.log(fn)//打印出fn()
            function fn(){
                console.log("hrllo 1807b")
            }
        }

    条件不成立:if里面的代码就不会执行,所以就不会打印函数fn()

    //条件不成立
        var a=12;
        console.log(fn)//undefined
        if(a==false){
            console.log(fn)//
            function fn(){
                console.log("hrllo 1807b")
            }
        }
        console.log(fn)//undefined

    以上是小编对Es5变量已经函数作用域的基础知识,现在我们开始学习Es6

    1.变量

    Es6提供了四种定义变量?

      第一种:let

      第二种:cont

      第三种:class

      第四种:import

    let:

    let它是Es6提供的一种声明变量的方式

    1.没有变量提升这个功能 在声明之前不能使用

    2.不能重复的声明

    3.不会给window添加属性

    let块级作用域:

    带 {} 的都是块级作用域,if(){}  for(){}  对象{} 函数不是块级 作用域,因为函数本身就是个私有作用域

    var 和function 没有块级作用域的这个概念,let和const有块级这个作用域

    作用域是对于变量的

    1.在块级作用域下 var和function 跟在window下一样,function很特殊,在块级作用域前,只会提前声明不会定义

    console.log(a)//undefined
        console.log(get)//undefined
        {
            console.log(get)//function(){}
            var a=5
            function get(){
                console.log(111)
            }
            
        }
        console.log(a)//5
        console.log(get)//function(){}

    2.在块级作用域下 let和conts声明的变量是私有的,外面访问不到

    {
            let a=100
        }
        console.log(a)//Uncaught ReferenceError: a is not defined

    3.在for循环下let 声明变量不会泄露

    var list=document.querySelector("#list").querySelectorAll("li")
        for(var i=0;i<list.length;i++){//length=3
            list[i].onclick=function(){
                alert(i)//3
            }
        }

    事件是异步的,for循环结束后i是3并且i还是全局的,点击了 li 最后弹出i,i此时是3,所以都会弹出3

    var list=document.querySelector("#list").querySelectorAll("li")
        for(let i=0;i<list.length;i++){//length=3
            list[i].onclick=function(){
                alert(i)//3
            }
        }

    4.块级作用域和对象的区别?

    这个是块级作用域:

    //    块级作用域
        {
            name:"zhangsan",
            age:12
        }

    {} 如果想表示对象,不能放行首,就是前面不能没东西,如果{} 前面没有东西 就是块级作用域

    console.log({
            name:"zhangsan",
            age:12
        })

    里面必须加一个() 因为如果不加就是个块级作用域,我们要把eval转成对象,对象前面不能没东西。

    eval 是将字符串转js代码

    eval('({name:"zhangsan",age:22})')
    console.log(eval('({name:"zhangsan",age:22})'))
    

      

    什么是暂时性死区?:

    如果块级作用域内使用 let和const声明变量了,这个区域就会被这个变量强制绑定,凡是在声明这些变量都是不可用的,使用会报错,这就是暂时性死区

    //    什么是暂时性死区?
        var a=10;
        {
    //会报错 Uncaught ReferenceError: Cannot access 'a' before initialization
            console.log(a);
            let a=20;
            console.log(a)
        }
        console.log(a)

    什么是暂时性死区的场景?:

    //    暂时性死区的场景
        function fn(a=b,b=2){
            console.log(a,b)
        }
        fn()

    使用变量b在定义b之前了,就出现了暂时性死区,a=b和b=2换下位置

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

    2.如果传对于的参数,就不要默认值了(就没有覆盖了),不是先赋默认值,然后再去实参去覆盖,如果没有参数在去

    let a=a 报错,赋值运算从右往左,右边使用变量a结果发现a没有声明,而let语法规定不能在没定义之前使用变量,所以报错。

    var a=a 不报错 因为var 有变量提升这个功能,在等会赋值时,从右往左,使用变量a此时a是undefined,赋值时候又把undefined覆给了a,所以a还是undefined

  • 相关阅读:
    第二节:依赖倒置原则和单一职责原则
    第一节:开闭原则和里氏替换原则
    leetcode 110 Balanced Binary Tree
    leetcode 102 Binary Tree Level Order Traversal
    leetcode 101 Symmetric Tree
    【产品】张小龙--微信背后的产品观
    【ML】目标检测及跟踪
    【设计】信息卡片设计
    【指标】游戏指标定义
    【GIT】windows本机搭建GIT服务器
  • 原文地址:https://www.cnblogs.com/jinfeixiang/p/11139404.html
Copyright © 2011-2022 走看看