词法作用域

1.词法阶段

    1.词法化:对源代码中的字符进行检查,如果是有状态的解析过程,还会赋予单词词义

    2.词法作用域:定义在词法阶段的作用域。由写代码时将变量和块作用域写在哪里来决定。

    3.例子:

       作用域气泡由其所对应的作用域块代码写在哪里决定,它是逐级包含的。

 

 

 

 

 

 

 

 

 

    4.查找

       作用域查找会在找到第一个标识符时停止。

       遮蔽效应:在多层嵌套作用域中可以定义同名的标识符。

2.欺骗词法

    1.eval

      ①作用机制:

         JavaScript中的eval()函数可以接受一个字符串为参数,并将其中的内容视为好像在书写时就存在程序中这个位置的代码。在执行eval()之后的代码时,引擎并不“知道”或“在意”前面的代码是以动态形式插入进来,并对词法作用域的环境进行修改。    

      ②限制:

         在严格模式下,eval()在运行时有其自己的词法作用域,意味着其声明无法修改所在的作用域。

    2.with

      ①用途:

          通常被当做重复引用同一个对象中多个属性的快捷方式,可以不需要重复引用对象本身

      ②作用机制:

          with可以将一个没有或有多个属性的对象处理为一个完全隔离的词法作用域,因此这个对象的属性也会被处理为定义在这个作用域中的词法标识符。

      ③eval()和with的区别:

  • eval()函数如果接受含有一个或多个声明的代码,就会修改其所处的词法作用域
  • with声明实际上是根据你传递给它的对象凭空创建一个全新的词法作用域。

    3.性能

      JavaScript引擎会在编译阶段进行数项的性能优化。其中有些优化依赖于能够根据代码的词法进行静态分析,并预先确定所有变量和函数的定义位置,才能在执行过程中快速找到标识符。

      但如果引擎在代码发现eval()或with,它就只能简单地假设关于标识符的判断都是无效的,因为无法再词法分析阶段明确知道eval会接收什么代码等

      最悲观的情况是如果出现eval函数或with,所有的优化可能都是无意义的。因此最简单的做法是完全不做任何优化。

 

 

 

 

      

       

         

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值