其实就是指的我们平时说的作用域、作用域链这些。
查找
词法作用域查找,只会查早一级标识符,如果遇到了foo.bar.baz
这种,词法作用域只会查找foo
标识符,找到这个变量之后,对象的访问属性规则会分别接管对bar
和baz
属性的访问。
欺骗词法
这种做法会导致性能下降,因为他们会修改或者创建新的作用域。javaScript
引擎会在编译阶段进行数项优化,其中有一项就是能够根据代码的词法进行静态分析,并预先确定所有变量和函数的定义位置,这样在执行的过程中就能快速找到标识符,提高性能。但是如果存在eval、with
这种词法欺骗,引擎就无法在词法分析阶段明确这两个地方会如果影响作用域,最差的情况是使用了他们之后,javaScript
不会进行任何优化,严重影响性能。
所以应该避免使用词法欺骗。
- eval:接收的字符串会被视为好像在书写时就存在于程序中的这个位置,会不受控的修改作用域中的变量。在严格模式下它有自己的作用域,无法修改所在的作用域。像
setTimeout、setInterval、new Function()
也可以接收字符串,然后字符串内容会被解析为一段代码,这些功能已经不再提倡使用 - with: 会创建新的作用域