• JS的作用域链


      JavaScript词法性质作用域

      简而言之就是,在JavaScript中,函数的作用域在编译时期就已经确定下来了,而不是取决于他的执行位置

    var num = 10;
    function method1() {
      console.log(num);
    }
    function method2() {
      var num = 20;
      method1();
    }
    method2();//输出10

      上边这个例子就印证了这一点,method1和method2都处于全局作用域当中,尽管method2的局部作用域中也存在变量num,method1在执行时会优先读取全局作用域中的变量num,所以method2的执行结果为10

      代码块中的作用域

      页面中可以放置多个<script>标签,每一个<script>标签被称作一个代码块,代码块之间可以相互访问(确切的说不完全是),当某一个代码块中出现了报错之后,这个代码块当中错误之后的代码不会再执行,但不影响这个代码块之后其他代码块的执行。

    <script>
      var b = 22;
      console.log("first");
      console.log(a); //a is not defined
      var c = 33</script>
    
    <script>
      console.log("second");
      console.log(a); //undefined
      console.log(b); //22
      console.log(c); //undefined
      var a = 12;
    </script>

      不同代码块在编译的时候预解析时,会把变量声明和函数声明提前到当前代码块的顶部,与其他代码块不互通

      根据预解析的原则,在代码块first运行时,a的声明在代码块second中,所以此时会报a is not defined错,此后的代码也不再被执行。代码块second运行时,a只被声明没有被赋值,所以是undefined;b在first代码块中已经完成了赋值操作,所以可以被正常输出22;c在first代码块中预解析时只被声明,赋值操作没有执行所以输出undefined

      自执行函数

      在我的理解里,自执行函数最主要的作用就是创建一个私有的局部作用域,以此来减少与上一层作用域中的变量冲突,因为在外部作用域中不能去访问自执行函数中变量或者方法。额外补充的是,今天了解到不只是()()的形式会形成自执行函数,!、+、-、×、/甚至逗号等运算符都可以形成自执行函数,本质是将函数声明转换为函数表达式,详细可以看http://www.cnblogs.com/jkj-jim/p/6374139.html

      

  • 相关阅读:
    CF_402C Searching for Graph 乱搞题
    zoj Simple Equation 数论
    zoj 3757 Alice and Bob and Cue Sports 模拟
    uva_12535
    boj1267 Infinite’s Cave 树形dp + 背包
    CF_216_Div_2
    nxlog4go 简介
    log4go的一些改进设想
    nxlog4go 的配置驱动
    nxlog4go Log Levels and Pattern Layout
  • 原文地址:https://www.cnblogs.com/missjingjing/p/10096832.html
Copyright © 2020-2023  润新知