zoukankan      html  css  js  c++  java
  • js中采用词法作用域


    所谓的 词法( 代码 )作用域, 就是代码在编写过程中体现出来的作用范围. 代码一旦写好, 不用执行,

    作用范围就已经确定好了. 这个就是所谓词法作用域.

    在 js 中词法作用域规则:

    1.函数允许访问函数外的数据.

    2.整个代码结构中只有函数可以限定作用域.

    3.作用规则首先使用提升规则分析.

    4.如果当前作用规则中有名字了, 就不考虑外面的名字.

    在编译语言中,**通常** 代码在被引擎执行之前会经历三个步骤:

    1. 词法分析(tokenzing/lexing)
    2. 解析/语法分析(parsing)
    3. 代码生成

    而 Javascript 则是在运行时编译,边编译边执行,这个机制涉及到三样东西:

    1. 引擎
    2. 编译器
    3. 作用域

    编译器首先对代码进行编译,然后将生成的代码提供给引擎执行。引擎和编译器工作的时候,都会用到作用域。编译器编译时,会在作用域中查找标示符,如果没有找到的话则会在对应的作用域创建一个标示符。引擎在执行时不断的在作用域中查找标示符,如果一直到全局对象(Global object)都没有找到的话则抛出一个 `Reference Error` 并停止代码的执行。

    主要来看一下作用域,作用域有两种主要的工作模式:词法作用域和动态作用域。大多数标准语言编译器的第一个工作阶段叫做词法化,词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是根据你写代码时变量和块作用域写在哪里来决定的,和你使用/调用的位置无关。

    看几个例子:

    A

    var num = 123;
    function f1() {
    console.log( num );
    }
    function f2() {
    var num = 456;
    f1();
    }
    f2();
    结果输出123


    B

    var num = 123;
    function f1() {
    console.log( num );
    }
    function f2() {
    num = 456;
    f1();
    }
    f2();

    结果输出456

    C

    function b () {

    var a = a || 2;
    console.log(a);
    }
    var a = 1;
    b() // 2

    结果输出2

  • 相关阅读:
    IntelliJ IDEA配置Tomcat 与安装Tomcat失败原因
    IntelliJ IDEA创建JavaWeb工程及配置Tomcat部署
    IntelliJ IDEA 通过GsonFormat插件将JSONObject格式的String 解析成实体
    as 插件GsonFormat用法(json字符串快速生成javabean)
    AndroidStudio导入项目一直卡在Building gradle project info最快速解决方案
    arraylist和linkedlist
    BNUOJ 3958 MAX Average Problem
    ZOJ 5579 Stean
    HDU 3401 Trade
    HDU 1695 GCD
  • 原文地址:https://www.cnblogs.com/ranyonsue/p/7504621.html
Copyright © 2011-2022 走看看