zoukankan      html  css  js  c++  java
  • JavaScript闭包

    1、定义

    指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。

    2、作用域链

    向上查找,一直找到全局变量的为止。(局部(参数列表)->全局)如果查找不到则undefind.

    3、几种闭包

    1)简单闭包

    a)函数(对象):this默认为当前对象,不带this的变量(先找局部变量,再找全局变量)

    2)复杂闭包

    a)函数中的函数:this默认为全局window. 不带this的变量(先找外部函数的局部变量,再找全局变量)

    b)数中的函数:通过call传递作用域后,this指向传递的作用域. 不带this的变量(先找外部函数的局部变量,再找全局变量)

    c)函数中的函数不会接收变量.

    4、简单闭包的实例

    在函数中使用全局变量是一个简单的闭包实例。请思考下面这段代码:

    var sMessage = "hello world";
    
    function sayHelloWorld() {//闭包
      alert(sMessage);// 不被计算的变量
    }
    
    sayHelloWorld();//计算sMessage

    在上面这段代码中,脚本被载入内存后,并没有为函数 sayHelloWorld() 计算变量 sMessage 的值。该函数捕获 sMessage 的值只是为了以后的使用,也就是说,解释程序知道在调用该函数时要检查 sMessage 的值。sMessage 将在函数调用 sayHelloWorld() 时(最后一行)被赋值,显示消息 "hello world"

    5、复杂的闭包实例

    在一个函数中定义另一个函数会使闭包变得更加复杂。例如:

    var iBaseNum = 10; //window
    
    function addNum(iNum1, iNum2) {
      function doAdd() { //闭包
        return iNum1+ iNum2+ iBaseNum;
      }
      return doAdd();
    }

    这里,函数 addNum() 包括函数 doAdd() (闭包)。内部函数是一个闭包,因为它将获取外部函数的参数 iNum1 iNum2 以及全局变量 iBaseNum 的值。 addNum() 的最后一步调用了 doAdd(),把两个参数和全局变量相加,并返回它们的和。

    这里要掌握的重要概念是,doAdd() 函数根本不接收参数,它使用的值是从执行环境中获取的。

    小结:

    闭包:

    1.       函数内部访问全局变量

    2.       内部函数闭包:

    a)         外部函数 全局变量

    6、更复杂的面向对象的闭包

    var testvar = 'window属性';
        var o3 = {
           testvar:'3',
           testvar2:'999',
           fun:function(){
              //var testvar = 'inner fun属性';
              //alert('o3: '+this.testvar); //o3
              //alert('o3: '+testvar);       //window
               
              var inner = function(){
                  //当前对象的作用域+全局作用域 :闭包
                 //alert('o3-inner: '+this.testvar); 
                 //alert('o3-inner: '+this.testvar2);
                 //alert('o3-inner: '+testvar);        
              };
              inner();                //this->window
              //inner.call(this);    //this->o3   不带this:外部函数  >  window  > undefind
              //inner.call(o2);         //this->o2   不带this:外部函数  >  window  > undefind
           }
        };
        o3.fun();//可以调用非o3声明的成员变量

    【温馨提示】《JS教程词法作用域和闭包-Javascript-Ajax-网页制作-网页教学网》改文件上传到百度云盘,有需要继续学习的小伙伴可自行下载。

    账号:http://pan.baidu.com/s/1bxWTIm

    密码:qu9v

    a)         函数中的函数:通过call传递作用域后,this指向传递的作用域. 不带this的变量(先找外部函数的局部变量,再找全局变量)

  • 相关阅读:
    DirectX11 With Windows SDK--14 深度测试
    DirectX11 With Windows SDK--12 深度/模板状态、平面镜反射绘制
    DirectX11--深入理解HLSL常量缓冲区打包规则
    JS学习笔记7_表单脚本
    JS学习笔记6_事件
    JS学习笔记5_DOM
    JS学习笔记4_BOM
    JS学习笔记3_函数表达式
    JS学习笔记2_面向对象
    JS学习笔记1_基础与常识
  • 原文地址:https://www.cnblogs.com/humanxiaoman/p/5022605.html
Copyright © 2011-2022 走看看