作用域
作用域为可访问变量的集合。分为词法作用域和动态作用域。
词法作用域:只需查看代码结构就可确定变量的作用域,而不是等到代码执行时才明白;
javascript使用的是词法作用域,它最重要的特征是它的定义过程发生在代码的书写阶段;
动态作用域:动态作用域并不关心函数和作用域是如何声明以及在任何处声明的,只关心它们从何处调用。换句话说,作用域链是基于调用栈的,而不是代码中的作用域嵌套
javascript有两种作用域:全局作用域;局部作用域/函数作用域;
顾名思义,全局变量在全局作用域,局部变量在局部作用域中。
全局变量网页中所有脚本和函数均可使用。 如果变量在函数内部没有用var声明,则也是全局变量,但不推荐。
作用域链
作用域链是查找一个变量的时候,一层一层的向上形成的查找轨迹。
每个函数都有自己的执行环境,环境内存储了作用域内定义的所有变量。当函数执行时,环境被推入环境栈中,执行完毕后,弹出环境,返回之前的执行环境。
作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问,作用域的前端,始终是当前执行代码所在环境的变量对象(也就是代码里最近的那个)
function foo(a) {
var b = a * 2;
function bar(c) {
console.log( a, b, c );
}
bar(b * 3);
}
foo( 2 ); // 2 4 12
标识符解析是沿着作用域链一级一级地搜索标识符地过程。搜索过程始终从作用域链地前端开始,然后逐级向后回溯,直到找到标识符为止(如果找不到标识符,通常会导致错误发生)—-《JavaScript高级程序设计》