About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • May

    27

    什么是词法作用域?什么时候函数未使用词法作用域?

    • 1 Comments
    • JavaScript
    • 发布:古树
    • 引用:0
    • 浏览:

    词法作用域就是指定义代码的时就决定了作用域范围,解释一个术语时最好的方法就是举一个简单的例子,下面这段虽然的  JS 代码,但它适用于所有包含词法作用域语言的概念:

    <script>
    var str = "global";
    function test(){
        alert(str);
        var str = "local";
        alert(str);
    }
    test();
    </script>

    如果不了解词法作用域,可能会认为上面的代码会先输出 global,然后再输出 local;事实际上它是先输出 undefined,然后再输出  local。

    JS 通常情况下定义一个函数后,它就是词法作用域,这意味着它运行在自己定义的作用域中,而不是运行在执行代码的作用域中。JS 解析器在加载 JS代码后并不会立刻执行,而是先解析 JS 代码,上面的函数实际上会被编译成如下类似的代码,然后再运行编译后的代码:

    <script>
    var str = "global";
    function test(){
        var str;
        alert(str);
        str  = "local";
        alert(str);
    }
    test();
    </script>

    但类似 JS 这样的语言本身也有例外情况,比如函数本身可以通过构造函数来动态的创建,并且 JS 解析器可以读取动态创建的 JS代码,并编译它们然后运行,但此时动态创建的函数并不使用词法作用域,编译后的代码当作顶级函数来编译。

    <script>
    var str = "global";
    function test(){
        var str = "local";
        return new Function("return str")
    }
    alert(test()());
    </script>

    所以上面的代码运行结果输出 global。但这种情况并不适用于所有需要预编译或需要编译后执行的代码,比如类似 Flash AS 这样需要预编译的代码,因为所有 Adobe 官方的 Flash 运行时环境都只有加载 ABC 码和解码的功能,运行时环境本身没有编译 ABC 码的功能。

    • Tags:
    • 2014 / 5 / 27
    相关文章:
      Post Comment.
      quote 1.古树悬叶
      2014/6/9 11:24:34
      词法作用域的本质是在定义它的作用域中执行,而不是在调用它的作用域中执行。

      发表评论