词法作用域
词法作用域就是在书写代码时产生的作用域,是由你将变量和块作用域写在哪里来决定的。12345678function foo (a) { var b=a*2; function bar(c){ console.log(a,b,c); } bar(b*3); }foo(2);//2,4,12
作用域有三块
1.包含着bar创建的作用域,标识符是c
2.包含foo创建的作用域,标识符是a bar b
3.全局,标识符foo
逐级嵌套的
修改词法作用域还有一个叫“欺骗”
两种机制:eval和with
eval(…)
|
|
eval内的代码引擎不知道他是以动态形式插入的,所以可以修改原来的词法作用域
with
|
|
O1中有定义a,o2中没有
with的本质是通过把一个对象的引用当做作用域来处理
不推荐使用的原因:
1.严格模式下with被完全禁止,eval(…)间接和非安全的使用也被禁止
2.性能差,因为引擎发现了eval和with后只能简单的假设关于标识符位置的判断都是无效的,也无法在此法分析阶段知道eval(…)会接收到什么代码,所以优化可能都是无意义的。