tip:有问题或者需要大厂内推的+我脉脉哦:丛培森 ٩( ‘ω’ )و
正常来说,执行期上下文的作用域链是不会改变的
JavaScript中的词法作用域并不是一成不变的
(词法作用域/静态作用域: 作用域由书写代码时函数声明位置决定)
有几种机制是可以欺骗词法的
它们是with()、eval()还有try-catch语句的catch子句
其中with和eval我们不应该去使用(会产生很多问题)
欺骗词法的意思就是欺骗词法作用域
也就是说,它们在运行时改变了作用域链
下面我就来谈谈这些可以欺骗词法的机制
#eval#
eval()函数接受一个字符串作为参数,并且解析字符串生成代码
var a = 123;
eval('console.log(a)');// 123
于是控制台打印了123
执行了eval函数之后
js引擎并不知道这段代码时动态插入的,并且修改了作用域链
引擎还会像往常一样查找作用域链
看下面的代码
var a = 1;
function demo(){
eval('var a = 2;');//欺骗词法
console.log(a);// 2
}
demo();
当eval函数执行时,在demo函数执行环境的最顶端作用域添加了变量a
这个局部环境中的a“遮蔽”了全局环境的a
最终导致程序打印2
e