前言
作用域可以说是绝大多数的编程语言里的一个重要的概念,当然Javascript也不例外。我们想要学好Javascript同样也需要理解他的作用域的工作原理。这篇文章是自己在学习Javascript作用域的理解和感悟,希望可以启发大家帮助大家更好的学习这一门语言。
Javascript作用域
作用域指的是程序源代码所定义的变量的区域,能够存储变量值。同时作用域也是一套规则,能够对变量进行访问和修改。在Javascript里,变量的作用域有全局作用域和局部作用域这两种区分。
1.全局作用域(Global Scope)
全局作用域,对象能够在代码中的任意地方访问到,例如:
var scope = "global";
function checkscope(){
var scope = "local";
console.log(scope);
}
console.log(scope); // "global"
checkscope(); //"local"
当然需要注意的是未定义直接赋值的变量的作用域也是全局作用域,例如:
function checkscope(){
var localscope = "local";
globalscope = "global";
console.log(localscope);
}
console.log(localscope); //"脚本错误"
console.log(globalscope); //"global"
checkscope();//"local"
同时我们也需要注意一点,所有的window对象的属性都作用域都是全局作用域。
2.局部作用域(Local Scope)
局部作用域,作用域只能够在固定的代码片段里面访问到。就拿我们第二个例子来说:
function checkscope(){
var localscope = "local";
globalscope = "global";
console.log(localscope);
}
console.log(localscope); //"脚本错误"
console.log(globalscope); //"global"
checkscope();//"local"
我们能够发现console.log(localscope);会有脚本错误的提示。这是因为localscope这个变量的作用域在函数checkscope内,外部访问console.log(...)访问不到所造成的。
Javascript词法作用域
作用域有两种工作模式,词法作用域和动态作用域。
词法作用域是定义在词法阶段的作用域。大部分标准语言的编译器它首先要做的事情是词法化,在这里我不做重点说明简单的提一下。词法作用域是你写的代码变量和作用域在哪里所决定。 先来看一个例子:
var a = 3;
function foo(){
console.log(a);
}
function boo(){
var a = 1;
foo();
}
boo(); // ?
自己原来的想法是foo(),是从它本身内部查找局部变量a,如果没有就从调用的函数的作用域,boo函数查找a,刚好有a = 1,所以结果会打印出1。
但是结果并不是我所想的那样,打印出的结果是3!!!

其原因是Javascript采用的是词法作用域,也称之为静态作用域。foo从自身查找局部变量a,没有发现就会往上一层查找找到a = 3; 所以会打印出3。
词法作用域意味着作用域是由书写代码时函数声明的位置来决定的。 编译的词法分析阶段 基本能够知道全部标识符在哪里以及是如何声明的, 从而能够预测在执行过程中如何对它 们进行查找。
结束语
这文章仅仅是自己对过去所学知识的总结,以后还会继续将Javascript中的重点,难点内容做一个系列来分享给大家。下一篇自己会介绍Javascript作用域链的知识点。