作用域
作用域是指程序源代码中定义变量的区域。
作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。
JavaScript 采用词法作用域(lexical scoping),也就是静态作用域。
静态作用域与动态作用域
作用域共有两种主要的工作模型。第一种是最为普遍的,被大多数编程语言所采用的词法
作用域也叫静态作用域,会在定义时候决定函数的作用域。
另外一种叫作动态作用域,仍有一些编程语
言在使用(比如 Bash 脚本、Perl 中的一些模式等),会在调用时候决定函数作用域。
静态作用域实例
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar();
由于js是采用词法作用域,所以foo函数的作用域在定义时候就已经确定,当前作用域内没有value,于是从上级中寻找value,也就是value=1
var a = 10;
var o = {
a:11,
b:{
fn:function(){
console.log(a);
}
}
}
o.b.fn();
这道题目一开始有点困惑,以为会输出11,结果输出的是10,因为变量 a 并不能读取到对象 o 的属性 a ,如果 console.log(o.a),就会打印 11,函数 fn 的作用域链为 [AO, Global.VO],而 Global.VO 中包括了变量 a 和变量 o
同时还说明了对象是并不能创建作用域的。
参考文章