zoukankan      html  css  js  c++  java
  • 作用域与闭包

             //作用域
                    /* 执行上下文
                     * 范围:一段<script>或者一个函数
                     * 全局:变量定义、函数声明;       一段<script>
                     * 函数:变量定义、函数声明、this、arguments; 函数
                     * PS: 函数声明 与 函数表达式区别
                     * */
                     
                     fn()
                     function fn(){
                         //函数声明
                     }    
                     //fn1() //undefined var fn1=undefined
                     var fn1=function(){
                         //函数表达式
                     } 
                     
                     //2. this
                     /* 构造函数 new
                      * 对象属性  obj
                      * 普通函数   window
                      * call apply
                      * */
                     
                     //无块级作用域
                     if(true){
                         var name= 'xxx'
                     }
                     console.log(name)  //xxx
                     
                     //函数和全局作用域
                     var a=100;
                     function fn2(){
                         var a=200
                         console.log('fn2',a)
                     }
                     console.log('g',a)  //100
                     fn2()    //200
                     
                     //作用域链  自由变量不断向父级去找
                     var a=100;
                     function fn3(){
                         var b=200;
                         
                         //当前作用域没有定义的变量,叫自由变量
                         console.log(a)
                         console.log(b)
                     }
                     fn3()
                     
                     //闭包
                     function F1(){
                             var c =100;
                             //返回函数
                             return function(){ //父级作用域是F1而不是全局
                                 console.log(c)  //自由变量去他父级作用域找
                             }
                     }
                     
                     var f1=F1();
                     var c= 200
                     f1()
                     
                     //作用域在定义时就确定了 而不是执行时
                     //闭包
                     //1、函数作为返回值;
                     //2、函数作为参数传递
                     
                     
                     function F1(){
                         var a=100;
                         return function(){
                             console.log(a)
                         }
                     }
                     var f1=F1();
                     function F2(fn){
                         var a=200;
                         fn();
                     }
                     F2(f1);
                     
                     /* 1.变量提升的理解
                      * `变量定义
                      * `函数声明()
                      * */
                     
                     //3.10个a
                     for (var 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)
                     }
                     
                     //4.如何理解作用域
                     //1.自由变量 2、作用域链,即自由变量查找 3、闭包的两个场景
                     
                     //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) //true
                     firstLoad(10) //false
                     firstLoad(20)  //true
  • 相关阅读:
    UPS FAQ-不错的UPS资料
    HPL.dat FAQ
    Fortran77计算某段代码的CPU运行时间
    存储知识 什么是LUN?LUN有什么用?对理解存储设备很有好处
    HPL.dat Tune
    UPS-瓦特(W)和伏安(VA):易混淆的两个概念
    mysql sql 索引相关用法,加快查询速度
    mysql 数据库分类设计方法与PHP结合
    c# SQLServer 数据库连接类
    .net上传图片生成大小缩略图
  • 原文地址:https://www.cnblogs.com/liujian9527/p/7338999.html
Copyright © 2011-2022 走看看