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

2020-09-11  本文已影响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'  可以改变对象内部的属性.

上一篇下一篇

猜你喜欢

热点阅读