js变量作用域建立在前面所讲的js解析与执行,变量作用域分为全局和函数,函数里的变量在函数外是无法访问的。
function a(){
console.log(x);
}
function b(){
var x = 5;
a();//报错
}
b();
//这段代码执行结果是x未定义。因为如前面js解析与执行中说的,函数调用时产生一个词法环境,而a中并没有x,并且它的上一级中也没有x所以这里显示x未定义。
上述只是简单的作用域。下面介绍下函数作用域链
var t = 0;
//t属于window
(function f(){
var a = 1;//属于f
function g(){
var b = 2;//属于g
function e(){
var c = 3;//属于e
console.log(a);
console.log(b);
console.log(c);
console.log(t);
console.log(d);//报错
}
window.h = e;
}
g();
})();
h();
/*
f为自调用立即执行函数,通过执行g()将e绑定到window.h上执行e
首先调用e时,它会创建一个词法环境,添加自己的变量等,在执行时,遇到a,本身词法环境中没有,会向他的父函数的词法环境中找,依次类推直到window对象,也就是全局词法环境,如果没找到到出现未定义错误。这就是作用域链,
* */