• javascript中的作用域与作用域链


    前几天,在写一段js代码时,出现了一些问题,调了很长时间也没有调通,其原因是,我在处理变量的作用域时错误地沿用了C++的作用域机制。因此我回炉了一次。

    如果你使用过C++或java等一系列的面向对象的编程语言,那么我相信一定对“作用域”这个概念并不陌生。它很好地体现了封装性,使得外面的环境不能轻易的访问到内部私有的变量或方法。我们也不必在变量命名上费神了。当然,在javascript中也有这种福利。不过,它和C++、java中的不太一样。

    在javascript中作用域是通过函数来划分的,即函数外面不能直接访问函数内部的变量(这一点与c++相同),但是请注意,在javascript中是没有代码块这个概念的,例如:

     1 a1;
     2 var a2;
     3 function f1(){
     4     b1;
     5                                                                                                                                          
     6     for(var i = 0;i < 5;i++){
     7     }
     8     var b2 = i;
     9     function f2(){
    10         c1;
    11         var c2 = i;
    12     }
    13     for(var i = 2;i < 7;i++){
    14     }
    15                                
    16                                                                                                                                          
    17 }

    其中,a1、b1、c1之前都没有用 var声明,即全局变量,在任何地方都能访问到,除非在内部有同名的局部变量,就会被暂时覆盖。另外,在for中定义的var i是可以在for的外面访问的,javascript中没有代码块,即for并不能算一次封装,函数才是封装的单元。用var声明的变量时局部变量,受作用域限制。

     

    对于作用域链的概念,即当我们使用一个变量时,要现在当前的环境中找,找不到,就再向上一级环境找,因此,作用域链就是一个栈,它用来保存,环境的包含关系。以上面的例子:函数f1()、f2()的关系:f1包含f2.如果程序执行到f2中,我们使用c2和b2,就要经历以下过程:先在作用域链在找到最顶端的环境,在里面找名字是c2和b2的变量,找到c2,即不再继续找(即使外面还有叫c2的变量),但是当前环境中没有名叫b2的局部变量。就再在作用域链上找上一级环境。如此重复,直到找到,如果到了最外层环境(全局),就看,有没有名为b2的全局变量。要是还没有,就将b2定义为全局环境下的全局变量,即相当于没用var声明(同a1、b1、c1)。

  • 相关阅读:
    vscode配置远程开发环境
    C++条件语句和循环语句
    C++整数相除、取模运算和自加
    C++基础数据类型
    C++定义常量、标识符命名、整型数据类型
    Android压力测试工具Monkey简介
    adb shell命令后出现error: device not found报错解决方案
    xadmin修改登录页面背景图
    windbg如何让.cmdtree自动执行?
    Rabbitmq入门到进阶看这篇就够了!
  • 原文地址:https://www.cnblogs.com/webARM/p/3780828.html
Copyright © 2020-2023  润新知