美文网首页
前端JS基础三(作用域 闭包)

前端JS基础三(作用域 闭包)

作者: EmilioWeng | 来源:发表于2018-08-01 16:19 被阅读0次

作用域

        没有块级作用域
            if(true){
                var name='zhangsan'
            }
            console.log(name)//'zhangsan'

        只有全局和函数作用域
            var a=100;
            function fn(){
                var a=200;
                console.log('fn',a)
            }
            console.log('global',a)
            fn()

作用域链

       var a=100
       function fn(){
           var b=200
           //当前作用域没有定义的变量,即'自由变量'
           console.log(a)
           console.log(b)
       }
       fn()

       var a=100;
       function F1(){
          var b=200;
          function F2(){
              var c=300;
              console.log(a); //a是自由变量
              console.log(b); //b是自由变量
              console.log(c);
          }
          F2()
       }
       F1();
  • 注意:函数的父级作用域是函数定义时候的作用域,不是函数执行时候的作用域,也就是说那个作用域定义了这个函数,这个函数的父级作用域就是谁,跟函数执行没有关系,函数自由变量要到父级作用域中找,就形成了作用域链。

闭包

1、实际开发中闭包的应用:封装变量,收敛权限

    function F1(){
          var a=100;
          //返回一个函数(函数作为返回值)
          return function(){
              console.log(a);//自由变量,父作用域寻找
          }
     }
     //f1得到一个函数
     var f1=F1();
     var a=200;
     f1();//100

     闭包使用场景
     函数作为返回值
     函数作为参数传递(函数自由变量要到父级作用域中找)
       function F1(){
          var a=100;
          return  function(){
              console.log(a);
          }
       }
       var f1=F1();
       function F2(fn){
           var a=200
           fn();//(自由变量要到声明定义时的父作用域中找,和执行的作用域没有关系)
       }
       F2(f1);//100

练习题

      练习题1、说一下对变量提升的理解
            ①变量的定义
            ②函数的声明(注意和函数表达式的区别)

      练习题2、说明this几种不同的使用场景
             参考上文**this**

      练习题3、创建10个`<a>`标签,点击的时候弹出来对应的序号
            var i;
            for(i=0;i<10;i++){
            (function(i){
               var a=document.createElement('a');
               a.innerHTML=i+'<br>';
               a.addEventListener('click',function(e){
               e.preventDefault();
               alert(i);
              })
              document.body.appendChild(a);
              })(i);//相当于创建了10个函数
            }

      练习题4、如何理解作用域
         自由变量
         作用域链,即自由变量的查找
         闭包的两个场景

      练习题5、实际开发中闭包的应用
      //闭包实际应用中主要用于封装变量,收敛权限
      function isFirstLoad(){
             var _list=[];
              return function(id){
                 if(_list.indexOf(id)>=0){
                     return false;
                 }else{
                    _list.push(id);
                    return true;
                 }
              }
      }
      //使用
      var firstLoad=isFirstLoad();
      firstLoad(10);
      firstLoad(10);
      firstLoad(20);
    //你在 isFirstLoad 函数外面,根本不可能修改掉_list的值

相关文章

  • 前端JS基础三(作用域 闭包)

    作用域 作用域链 注意:函数的父级作用域是函数定义时候的作用域,不是函数执行时候的作用域,也就是说那个作用域定义了...

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • JS基础知识:变量对象、作用域链和闭包

    JS基础知识:变量对象、作用域链和闭包 前言:这段时间一直在消化作用域链和闭包的相关知识。之前看《JS高程》和一些...

  • javascript面试准备(一)

    interview js 基础 原型 原型链 作用域 闭包 异步 单线程 js Api dom 操作 ajax 事...

  • 闭包

    一、理解闭包前js基础1、作用域链(作用域、作用域链中有说)。2、js的内存回收机制。一个函数在执行开始的时候,会...

  • js闭包的理解

    什么是闭包 通俗的来讲,个人觉得闭包就是延长变量作用域的函数。众所周知js的作用域分为全局作用域和链式作用域。在函...

  • Javascript 闭包

    如果要了解闭包,我们需要先了解闭包的由来,闭包的产生,源于JS的词法作用域 词法作用域 作用域是指一个 变量能够访...

  • js 闭包

    一、js 作用域 讲闭包首先就要理解 js 的作用域。再 ES5 中,js 有两种作用域,全局作用域和函数作用域(...

  • JS 闭包(Closure)

    参考阮一峰老师的JS 闭包 理解闭包前需要理解变量作用域、变量提升 JS作用域 那如何让它依次打印,12345呢;...

  • js闭包详解

    1.什么是闭包? 要了解什么是闭包,首先你要了解作用域。 js的作用域分两种,全局作用域和局部作用域。 我们知道在...

网友评论

      本文标题:前端JS基础三(作用域 闭包)

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