预解析
JavaScript引擎在对JavaScript代码进行解释执行之前,会对JavaScript代码进行预解析,在预解析阶段,会将以关键字var和function开头的语句块提前进行处理。
预解析的情况
1.函数声明会提升
2.函数表达式不会提升
3.变量的提升,变量提升但赋值不会提升
4.变量名与函数名相同时,函数会提升 变量不会
5.提升不会超出作用域范围
作用域
全局作用域
直接编写在 script 标签之中的JS代码,都是全局作用域;
或者是一个单独的 JS 文件中的。
全局作用域在页面打开时创建,页面关闭时销毁;
在全局作用域中有一个全局对象 window(代表的是一个浏览器的窗口,由浏览器创建),可以直接使用。
所有创建的变量都会作为 window 对象的属性保存。
局部作用域(函数作用域)
在函数内部就是局部作用域,这个代码的名字只在函数的内部起作用
调用函数时创建函数作用域,函数执行完毕之后,函数作用域销毁;
每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的。
隐式全局变量
1.不用var声明的变量
2.用var声明且用;隔开的也是全局变量
3.用var声明,且用=连接的也是全局变量
案例
原题
function test() {
console.log(a);
console.log(b);
var b = 234;
console.log(b);
a = 123;
console.log(a);
function a() {}
var a;
b = 234;
var b = function () {};
console.log(a);
console.log(b);
}
test();
预解析后
function test() {
function a() {}
var b;
console.log(a); //f(){}
console.log(b); //undefined
b = 234;
console.log(b); //234
a = 123;
console.log(a); //123
var a;
b = 234;
var b = function () {};
console.log(a); //123
console.log(b); //f(){}
}
test();