作用域:
作用域就是一个独立的地盘,让变量不会外泄、暴露出去。也就是说作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。
简单举个例子说明一下:
//域1
function foo(a){
//域2
var b = a * 2;
function bar(c){
//域3
console.log(a,b,c);
//域3
}
bar(b * 3);
//域2
}
foo(2);//2,4,12
//域1
最后输出的结果为 2, 4, 12
域1 是全局作用域,有标识符 foo;
域2 是作用域 foo,有标识符 a,bar,b;
域3 是作用域 bar,仅有标识符 c。
作用域链:
什么是作用域链:
如果父级也没呢?再一层一层向上寻找,直到找到全局作用域还是没找到,就宣布放弃。这种一层一层的关系,就是 作用域链 。
简单举个例子说明一下:
var a = 10;
function fn(){
var b = 10
function fun1(){
console.log(c);//undefined
b += 5;
var c = 20;//此处给c赋值
}
console.log(b);//10
fun1();
console.log(b);//15
}
fn();
此例子共有3层
第一层:
Window Go{
a:10;
fn:
}
第二层:
fn Ao{
b:10;//在第三层是b值变为15
fun1:
}
第三层:
fun1 Ao{
c:20;
}
在第三层我们没发现b声明,所以我们需要往上层查找,应此我们在第三层对b的值进行更改时,第二层b的值将发生变化;如果这里第一层,第二层都有b,找到的b还是第二层,因为第三层的上一层是第二层,一旦在第二层找到将停止查找,就不会去第一层查找;