一、概念
作用域: 域,指的是一个空间、范围、区域,作用指的是在域内可进行读写操作。一个变量的作用域是程序源代码中定义的这个变量的区域。
在ES5中,只存在全局和函数级作用域,在ES6中,引入了块级作用域,js的预解析机制大概分为两个过程:预解析和自上而下逐行解读。
预解析: js解析器会先把var定义的变量、function、参数等一些东西存储进仓库里面(内存)。变量var在正式运行之前,都赋值为undefined,function函数在运行之前,就是整个函数块
预解析结束之后,就是逐行解读
JS解析过程:1、预解析。2、逐行解读代码,下面看几个例子。
例子一:
var有预解析,let、const没有预解析
console.log('我是a', a)
console.log('我是b', b)
console.log('我是c', c)
var a = 123
let b = 456
const c = 789
这里报错的问题,他是一个警告,在初始化之前不能访问
为什么会输出一个undefined呢?
因为预解析的机制就是,先放到全局的最顶端按先声明后赋值
相当于
var a
console.log(a)
a = 123
例子二:
console.log(a);
var a = 1;
执行结果:undefined
console.log(a);
a = 1;
执行结果:Uncaught ReferenceError: a is not defined
未捕获的ReferenceError: a未定义
总结:第一种结果是预编译使 a=undefined,第二种结果是直接报错。
例子三:
function
的优先级要高于var
var fn = 123
function fn() {
console.log(123)
}
console.log('结果是', fn)
结果是:123
解析的流程
1.先声明的 function fn()
2.在声明 var fn 把 function fn的值修改了
3.所以结果是123