《你不知道的javascript》之词法作用域

本文深入探讨了作用域的概念,解释了词法作用域的定义及其在编程中的应用。通过理解词法化过程,读者将了解到词法作用域是如何在函数声明时确定,并保持不变的。同时,文章还讨论了如何通过eval和with机制‘欺骗’词法作用域,以及这种做法可能带来的性能问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先要弄清楚什么作用域?

作用域其实就是一套规则,用来存储和查找程序中的变量。这套规则可以管理引擎在当前作用域以及嵌套的子作用域中根据标识符来查找变量。

要理解词法作用域,首先要知道什么是词法。词法化是大部分标准语音编译器的第一个工作阶段,主要对源代码中的字符进行检查,然后将其分解成有意义的代码块。而词法作用域就是定义在词法化阶段的作用域。当你写下块作用域和变量时,已经决定了词法作用域就在那里,通常情况下这个作用域是不会变的(欺骗词法除外,下面会将会介绍)。

 作用域结构以及相互之间的位置为引擎提供了足够的位置信息,方便其查找标识符,作用域查找到第一个标识符就会停止,其实说白了,作用域就是为引擎服务的,引擎需要什么,有的情况下就乖乖提供好了。

对于函数,无论其在哪里调用,如何调用,其词法作用域都有其函数声明时所处的位置决定。

欺骗词法

欺骗词法什么意思呢?上面我们提到过,正常的词法作用域是由函数声明的时候决定的,如果要想在运行时改变呢?这里有两个方法,一个用eval,一个用with,也代表两种机制,我们看下其原理。

我们很清楚,eval(...)中可以传入一段字符串作为参数,字符串是一段代码,eval所在的位置就是代码段执行的位置,这样就会修改其所在的作用域。

性能问题

利用eval固然可以实现想要的功能,但是,由于JavaScript 引擎会在编译阶段进行数项的性能优化,有些优化主要依据词法分析得到的变量和函数的位置,才能在执行过程中快速找到标识符。在遇到eval时,在词法分析阶段由于无法判断其里面的代码,所以就会简单的认为没有优化的必要。如果程序中遇到大量的eval,性能肯定是会降低的,所以不建议用eval。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值