• javascript函数作用域、闭包以及匿名函数2


    接上上次说的补充:http://www.cnblogs.com/zhangmingzhao/p/7740565.html

    1.

    首先要明确的是js中的基本概念

    1. 作用域
      js主要的作用域形式就是全局作用域函数作用域(局部作用域),没有块级作用域,不过在ES6中用let声明的变量具有块级作用域的效果。
    2. 执行环境、变量对象
      执行环境分为全局执行环境和函数执行环境,就是当前代码的执行上下文,简单说就是定义了变量或函数访问其他数据的权限,控制着变量和函数的可见性与生命周期,每个执行环境都有一个与之关联的对象即变量对象,环境中定义的所有变量和函数都保存在这个对象中。全局环境是最外围的,而每个函数有自己的执行环境。
    3. 作用域链
      代码在一个环境中执行时就会创建变量对象的一个作用域链,作用域链前端始终是当前执行环境的变量对象,下一个变量对象来自包含(外部的)环境,全局执行环境的变量对象始终是作用域链的最后一个对象,就像洋葱一样,如果你愿意一层一层剥开它的心,就很好理解了。
    4. 立即执行函数表达式
      ()这括号有两种意义,一是指代一个表达式,二是表示函数执行。

      //函数表达式
      var fuc = function() {};
      //匿名函数直接执行(立即执行函数表达式)
      (function(){})();

    上面的效果就是很好的创建了一个作用域,可以做到外部作用域中不能够访问内部,就好像被屏蔽了一样。所以上面你在全局环境声明变量a又在函数环境声明a两个就没什么联系了,两个处于不同的变量对象内部,虽然名字相同。但是如果你在函数内部不声明a,而是直接a = 5赋值,则外部的a会改变,这是因为内部通过作用域链访问到外部的变量并赋值。理解了作用域链就很好理解这些问题了。
    最后,什么是闭包?,答:就是能访问局部变量的函数!!方式是如下(实质还是通过作用域链)

     
    var funcName = function() {
        return function() {
        }
    }

     

    2.

    问题应该是javascript函数作用域、闭包以及匿名函数的概念不是很清楚。重点要看一下javascript函数章节。

    接下来简单说一下:1.function iterator(i){}函数名:iterator ;*注意()前面如果没有iterator就变为匿名函数,调用方法:iterator(参数)

    2.(do someting...)()匿名函数必须立即调用否则没有意义;具名函数可以通过名字调用如上;匿名函数总不能在某个地方用()表示调用了吧,哈哈,浏览器不知道你在干啥。

    3.当在2中的dong someting 为一个函数时就构成了一个闭包,两个或以上函数嵌套函数就组成了闭包,此例子中的外层函数为匿名函数比较特殊,除此之外函数有自己的作用域,以 function iterator(){作用域在这里}为例,花括号内为此函数的作用域,(匿名作用域在这里)(匿名立即调用);

    4.

    var a = 6;//匿名函数的外部作用域

    (function() {//内部函数,也是匿名函数;连个函数嵌套形成闭包,此为匿名函数的作用域,更具体就叫做内部作用域

    var a = 5;

    console.log(a)//a为5,a的取值方法为一层一层向外找,如果没有"var a=5"此时a=6
    })();

    5.function a(){

    function b(){//闭包形成

    }

    }

  • 相关阅读:
    Angular vs. React vs. Vue
    探索Virtual DOM的前世今生
    GRPC 负载均衡
    揭秘!用标准Go语言能写脚本吗?
    grpc 连接 复用 在 Go 中发现竞态条件 (Race Conditions)
    读取网络包
    User Datagram Protocol
    注册表项 DeviceInstance
    gopacket 抓包 过滤器
    Mysql 通信协议抓包分析
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7745403.html
Copyright © 2020-2023  润新知