你不知道JavaScript学习二——词法做用域

做用域有两种工做模型:
第一种是最为广泛的,被大多数编程语言所采用的词法做用域
第二种叫做动态做用域
词法做用域就是定义在词法阶段的做用域。换句话说,词法做用域是由你在写代码时将变量和块做用域写在哪里来决定的,所以当词法分析器处理代码时会保持做用域不变。
做用域气泡由其对应的做用域块代码写在哪里决定,它们是逐级包含的。
查找
做用域查找首先从最内部的做用域,逐级向外或者说向上进行,直到碰见第一个匹配的标识符为止。
做用域查找会在找到第一个匹配的标识符时中止。
function foo(a) {
var b = a * 2;
function bar(c) {
console.log( a, b, c );
}
bar( b * 3 );
}
foo( 2 ); // 2, 4, 12

 

 

(1)包含着整个全局做用域,其中只有一个标识符: foo 。
(2)包含着 foo 所建立的做用域,其中有三个标识符: a 、 bar 和 b 。
(3)包含着 bar 所建立的做用域,其中只有一个标识符: c 。javascript

欺骗词法
(1)eval
在执行 eval(..) 以后的代码时,引擎并不“知道”或“在乎”前面的代码是以动态形式插入进来,并对词法做用域的环境进行修改的。引擎只会如往常地进行词法做用域查找。
(2)with
with 能够将一个没有或有多个属性的对象处理为一个彻底隔离的词法做用域,所以这个对象的属性也会被处理为定义在这个做用域中的词法标识符。
另一个不推荐使用 eval(..) 和 with 的缘由是会被严格模式所影响(限制)。 with 被彻底禁止,而在保留核心功能的前提下,间接或非安全地使用eval(..) 也被禁止了。
相关文章
相关标签/搜索