无论是with表达式,还是try catch表达式的catch子句,抑或是包含的函数,都被认为是动态作用域。一个动态作用域只因代码运行而存在,因此无法通过静态分析(代码结构)来确定是否存在动态作用域,例如:
function execute(code){(code);
function subroutine{
return window;
}
var w=subroutine;
};
execute函数看上去像一个动态作用域,因为它使用了。w变量的值与code有关。在大多数情况下,w将等价于全局的window对象,但下列情况除外。
execute("var window={};")
在这种情况下,由于在execute函数中创建了一个局部window变量,所以w将等价于这个局部总的window变量而不等价全局中的那个window变量。所以说,不运行这段代码是没有办法了解具体情况的,因为标识符window的确切含义不能预先确定。
优化的JavaScript引擎,如Safari的Nitro引擎,企图通过分析代码来确定哪些变量应该在任意时刻被访问,以加快标识符识别过程。这些引擎企图避开传统作用域链查找,以标识符索引的方式进行快速查找。在涉及一个动态作用域后,此优化方法就不起作用了。正是这个原因,只在绝对必要时才推荐使用动态作用域。