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

    2. 其实LZ要理解这个问题,要明白JS中的作用域(scope)。
    每个函数在创建完成时,他有3个重要的内置属性(property)也同时被创建。
    {
    AO //记录function内的变量,参数等信息
    this // 就是在调用this.xx的时候的this
    scope // 指向外层函数AO的一个链(在实现的时候,可能通过数组来实现).
    }
    JS中,大家经常讲的Scope其实是这样:SCOPE=AO+scope.
    回到闭包的问题上:
    如果我们这样写这个程序:
    for(var i =0; i<link.length; i++){ //window scope
    link[i].onclick = function(){ alert(i); }; // inner function

    }
    可以得到inner function的SCOPE是这样的:

    {
    AO
    this // 等于link[i]
    scope // 指向window的记录,包括我们需要的变量i
    }
    这个for循环会立即执行完毕,那么当onclick触发时,inner function查找变量 i 时,会在AO+scope中找,AO中没有,scope中的变量i已经成为了link.length.

    利用大家所说的闭包写这个程序:
    //here is the window scope
    for(var i =0; i<link.length; i++){

    link[i].onclick = (function(i){ // outer function
    return function(){ //inner function
    alert(i);
    };
    })(i);

    }
    分析inner function的SCOPE:
    {
    AO // no important infomation
    this // we don't care it.
    scope //outer function and window scope
    }
    outer function的SCOPE
    {
    AO // 包含参数i
    this // don't care it .
    scope // window scope.
    }


    这时,如果inner function被触发,他会从自己的AO以及scope(outer function的AO 和 window scope)中找寻变量i. 可以看到outer function的AO中已经包含了i,而且对于这个for循环,会有对应有N个(function(){})() 被创建执行。所以每个inner function都有一个特定的包含了变量 i 的outer function。

    这样就可以顺利输出0,1,2,3。。。。。。。。。

    结论: 我们可以看到,闭包其实就是因为Scope产生的,所以,广义上来讲,所有函数都是闭包。

  • 相关阅读:
    spring-tool-suite-4-4.3.2.RELEASE-e4.12.0-win32.win32.x86_64 下载
    day39_Spring学习笔记_07_CRM_03
    MyEclipse 中 报错 ERROR PARSER:56
    day38_Spring学习笔记_06_CRM_02
    最简单的递归/死循环
    day37_Spring学习笔记_05_CRM_01
    如何在Linux中发现IP地址冲突
    如何在Linux中用命令行工具管理KVM虚拟环境
    使用 Shell 脚本自动化 Linux 系统维护任务
    Linux系统多网卡绑定实战
  • 原文地址:https://www.cnblogs.com/afei-happy/p/4293092.html
Copyright © 2011-2022 走看看