• 作用域与闭包


             //作用域
                    /* 执行上下文
                     * 范围:一段<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
  • 相关阅读:
    面向对象设计原则之接口隔离原则
    面向对象设计原则之开闭原则
    [OOD]违反里氏替换原则的解决方案
    错误程序
    error: ‘for’ loop initial declarations are only allowed in C99 mode
    函数模板
    查找
    队列类模板
    栈类模板
    单链表的结点类模板
  • 原文地址:https://www.cnblogs.com/liujian9527/p/7338999.html
Copyright © 2020-2023  润新知