美文网首页
javascript 闭包原理以及var let const作用

javascript 闭包原理以及var let const作用

作者: 黑白说程序 | 来源:发表于2020-09-11 09:10 被阅读0次

    在js中,var在if和for中是没有作用域,let在if和for中是有作用域的,他们在函数都是有作用

    图中,function中定义个age,无论前面是let还是var 在外面打印都是会报错的( age is not defined)。只有在函数内可以访问到

    在if总定义的height变量,是用var定义,log打印是可以打印出120的,但用let定义height是无法打印会报错,这就是因为var在if和for中是没有作用域,let在if和for中是有作用域的

    注意 ,函数在多次调用,会开辟多个内存空间,

    因为var没有作用域,但是在function里是有作用域,所以就产生了闭包,在es5中用闭包来解决作用域的问题

      //使用let定义变量有作用域

      var butNum = document.getElementsByTagName('button')

        for (let index = 0; index < butNum.length; index++) {

          const element = butNum[index];

          element.addEventListener('click',function () {

            alert('这是第'+index+'个按钮')

          })

        }

        {index=0

          element.addEventListener('click', function () {

          alert('这是第' + index + '个按钮')

        }

        {  index=1

          element.addEventListener('click', function () {

          alert('这是第' + index + '个按钮')

        }

    //使用var定义变量没有作用域

      for (var index = 0; index < butNum.length; index++) {

        var element = butNum[index];

        element.addEventListener('click', function () {

          alert('这是第' + index + '个按钮')

        }

        {index=1  //这里的index,会因为var没有作用域所以本来是0,会被下面那个1所覆盖

          element.addEventListener('click', function () {

          alert('这是第' + index + '个按钮')

        }

        {  index=1

          element.addEventListener('click', function () {

          alert('这是第' + index + '个按钮')

        }

        function有作用域,所以利用立即执行函数形成闭包解决

        for (var index = 0; index < butNum.length; index++) {

          var element = butNum[index];

          (function (params) {

            element.addEventListener('click',function () {

             alert('这是第'+params+'个按钮')

           })

          })(index) //立即执行函数

        }

    上面的for循环,是相当于把每个button按钮都赋值一个点击事件,let让每个事件都应该有自己的作用域,但是var没有作用域,每个事件用的变量,都会被最后一个值所覆盖

    const 在开发中优先使用const,

    1.注意一:一旦给const修饰的标识符被赋值之后,不能修改

    const myname = ' linlin';

    name =‘lili’

    2.注意二:在使用const定 义标识符,必须进行赋值

    const name ; 这样是报错的 Missing initializer in const declaration

    /3.注意三:常量的含义是指向的对象不能修改,但是可以改变对象内部的属性.

    const obj={name:‘linlin’,age:‘3’}

    const obj=1; 这里是会报错 Assignment to constant variable. 

    obj.name='lili'  可以改变对象内部的属性.

    相关文章

      网友评论

          本文标题:javascript 闭包原理以及var let const作用

          本文链接:https://www.haomeiwen.com/subject/biupektx.html