你不知道的javascript-上卷-第一部分作用域和闭包 第2章 词法作用域
发布日期:2021-05-14 11:07:11 浏览次数:18 分类:精选文章

本文共 770 字,大约阅读时间需要 2 分钟。

2.1 词法作用域

词法作用域是指在编译阶段(词法分析阶段)写入代码时确定的作用域。它是根据变量和块的书写位置决定的,编译器在处理代码时会基于词法结构保持作用域不变。

2.2 欺骗词法 - 不推荐使用:eval 和 with

在运行时如何修改或创建词法作用域?JavaScript 提供了两种机制:eval 和 with。

eval modify its surrounding lexical scope

  • eval函数将传入的字符串当作代码执行。例如:

    function foo(str, a) {
    eval(str); // 欺骗!
    console.log(a, b);
    }
    var b = 2;
    foo("var b = 3;", 1); // 输出 "1, 3"

    eval 执行的代码在运行时动态修改了周围的词法作用域。

  • with 创建全新的词法作用域

    function foo(obj) {
    with(obj) {
    a = 2;
    }
    }
    var o1 = {a:3}, o2 = {b:3};
    foo(o1); console.log(o1.a); // 2
    foo(o2); console.log(o2.a); // undefined
    console.log(a); // 2

    with 通过动态创建新的词法作用域,重定向变量查找。

  • 2.3 性能考量

    eval 和 with 都会导致编译器无法在编译阶段对标识符位置进行优化,最终影响运行速度。

    由于 JavaScript 引擎的优化依赖于词法分析,这两种机制会使优化无效,严重影响性能。

    总结

    词法作用域决定了变量查找的规则。eval 和 with 可以动态修改词法作用域,但因为其对性能的负面影响,最佳实践是避免使用它们。

    上一篇:javascript数据结构与算法-队列结构
    下一篇:你不知道的javascript-上卷-第一部分作用域和闭包 第1章 作用域

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年04月06日 11时12分57秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章