JavaScript-ECMAScript之作用域

  • 作用域定义和作用

      作用域定义:JavaScript中存储变量和查找变量的一套规则。

      JavaScript中一般遵循词法作用域。

      变量查找遵循从内到外查找:

      引擎从当前的执行作用域开始查找变量,如果找不到就向上一级继续查找。当抵达最外层的全局作用域时,无论找到还是找不到,查找过程都会停止。

  • 词法作用域

         定义在词法阶段的作用域。是在写代码的时将变量和块作用域写在哪里来来决定的。

  •  作用域的产生

          JavaScript中没有块状作用域的概念。那么什么是块状作用域呢 简单说就是{..}括起来的区域就是一个最小单元的块。

 我们可以简单 回顾一下c#或者Java语言中变量的作用域和申明周期 一般情况下是这样的

     变量的作用域:

    作用域从变量定义的位置开始,到该变量所在的那对大括号结束;

生命周期:

    变量从定义的位置开始就在内存中活了;

    变量到达它所在的作用域的时候就在内存中消失了;

 

举一个最简单的例子 for循环 

C#中 for中定义的i 变量在 循环外访问不到

          JavaScript 中在for循环外 可以正常访问

   那么JavaScript 在什么时候创建作用域呢

  1.   全局作用域  

           这个无需做过多的解释,相信大家都理解

          2. 函数

           javaScript中每创建一个函数都会为其自身创建一个作用域气泡。属于这个函数的所有变量可以在整个函数内部使用及复用

  • 块状作用域 

      上面说了js中没有块状作用域,但是凡是有例外,js中有几种情况可以提供块状作用域的效果

1: Try/catch

Catch 分句会创建一个块状作用域,其中声明的变量仅在catch内部有效

try{

undefined();

}catch(err){

console.log(err);  // 能够访问

}

 console.log(err); //这里访问不到了,ReferenceError: err not found

  2: Let

Let 可以将变量的作用域绑定在所在的 {…}块状作用域中

Var foo=true;

If(foo){

  Let bar=foo*2;

  Console.log(bar);  //正常访问

}

Console.log(bar); // ReferenceError

l  使用 let 进行的声明不会再块状作用域中进行提升。

{

  Console.log(bar);// ReferenceError

 Let bar=2;

}

              3:Const

Const 也会创建块状作用域,但是它的值是固定的,之后任何试图修改的操作都会引起错误。

  • 作用域提升

函数声明和变量声明会提升。而赋值或其他运行逻辑会留在原地。当函数声明和变量声明同时出现时,函数会首先被提升,然后才是变量。

                        函数表达式不会被提升

作用域提升会被提升到所在块状作用域的的顶部,即所在{…}的顶部

<script type="text/javascript">

           foo(); //访问不到

        //  var a=true;

            {

               foo(); //可以访问得到

               function foo(){

                   console.log("a");

               }

          

           }

       </script>

  

    

 

  • 作用域闭包
  • 立即执行函数
  • 欺骗词法作用域

猜你喜欢

转载自www.cnblogs.com/cuner/p/12453565.html