为什么会有作用域
1.存储变量的值 并且对其访问修改 是几乎所有的编程语言的最基本的功能
2.程序引入变量,我们需要知道变量存在了什么地方 ,如何找到它们
于是有了作用域的存在
作用域是什么
作用域就是 一套规则,一套设计良好的存储变量的规则,并通过这个规则确定当前执行的代码对这些变量的访问权想
深入理解作用域
通过模拟成个人物之间的对话 来理解作用域
1.人物:引擎 编译器 作用域
2.对话过程
假如我们遇到了 代码 var a = 2
在引擎眼里 这是两个完全不同的声明 一个由编译器在编译时处理,另一个则由引擎在运行时处理
编译器编译时,问作用域是否已经存在这个名称的变量存在于同一个作用域集合中,作用域回答有,编译器忽略声明,继续进行编译;否则,他会要求作用域在当前的作用域的集合中生命一个新的变量,命名为 a
接下来,编译器会为引擎生成编译所需的代码
引擎运行时首先问作用域,在当前的作用域集合是否存在一个叫做a的变量,作用域回答有,引擎使用这个变量;否则,引擎会继续查找这个变量
作用域分类
一.词法作用域
什么是词法作用域
定义在词法阶段的作用域,话句话说,词法作用域是由你在写代码时将变量和块作用域写在那里决定的
function foo(a){
var b = a * 2;
function bar(c){
console.log(a,b,c)
}
bar(b * 3)
}
这个例子包含三个嵌套的作用域,我们可以把它们想象成一一个个作用域气泡
1.整个全局作用域
2.foo创建的作用域
3.bar创建的作用域
作用域气泡由其对应的作用域快代码写在哪里决定的
二.函数作用域
函数作用域是指属于这个函数的全部变量都可以在整个函数的范围内使用及复用
三.块级作用域
举个例子,瞬间明白
for(var i = 0;i<10;i++){
console.log(i)
}
变量i 只能在for循环内部的上下文中使用,忽略i会被绑定在外部作用域的实时
我们常见的块级作用域 还有 if判断里面声明的变量 ,with关键字,try/catch的catch分句也会创建一个块作用域