首先 ,什么是变量的作用域呢?
顾名思义,域就是范围的意思,变量的作用域就是变量作用的范围。
首先,要想知道变量的作用范围,我们要先了解全局变量和局部变量
全局变量 : 在代码的最外层声明变量,我们称为全局变量。在任何地方都可以使用的变量,包括函数内部;
局部变量: 在函数内部声明的变量,我们称为局部变量.只能在函数内部使用。
废话少说,上代码
var g =500; //变量声明在最外层,作用于全局
var r = 30;
console.log(g);//500
function fn() {
var g = 300; //局部变量
console.log(g);//300
sum();
function sum(){
console.log(r);//30 r是在最外层声明的 全局变量
}
}
fn(); //执行函数
变量c 没有声明,往上一级找到就赋值,如果没有就到window对象里面添加
OK,学习完变量的作用域后,我们就开始讲我们本节的难点,作用域链。
作用域链 :通俗地讲,当声明一个函数或变量时,如果局部需要访问该变量或函数时,刚好自己本身没有该变量或函数,局部作用域会往上一级找,这就是作用域链。
如下图:
概念懂了,但是在实际操作中,编辑器是如何执行我们的代码呢?不要担心,让小编来为你解答。那就让我们来学习一下JS解释器执行js代码的大致过程。
JS解释器执行js代码的步骤:
- 语法检查:大小写、括号匹配等语法检查;
- 预编译:
- 全局预编译:
- 创建一个GO对象,即GlobalObject,执行期上下文;
- 把声明的全局变量作为属性追加到该对象里面;
- 把函数声明作为对应的属性值;
- 局部预编译:在函数调用的前一刻开始预编译 AO;
- 创建一个AO对象,即ActiveObject,函数的执行期上下文;
- 把函数内部声明的变量、函数名和形参作为属性追加到该执行期上下文对象面;
- 把实参的值赋值给对应的属性;
- 把函数内部声明的函数作为值赋值给对应的属性;
- 全局预编译:
- 执行语句:赋值语句、函数调用语句、循环语句、判断语句等;
天呐,这是什么东东,这也太复杂了吧,看不懂了吗?不要害怕,我们来代码中体验,效果会更好。这些都是面试题哦。
请记住变量只提升声明,不提升赋值;
一个代码只有一个GO,但是可以有多个AO。
练习一
练习二
练习三
在局部变量中,如果有 没有声明的变量,则往上一级找,找到就赋值,如果没有就到window对象里面添加
练习四
练习六
(function () {b = 3;var a = b;}) ,在函数外面加()表示强制调用
(function () {b = 3;var a = b;})() ,在函数后面j加() 表示自己调用自己
== 等于 != 不等于 | 只比较值 |
===全等于 !== 不全等于 | 比较值和类型 |
console.log (typeof (typeof undefined));//string
练习七
练习八