知识点一:预解析
预解析是指:在执行之前 将变量和函数的声明提升到作用于最前面
JS引擎运行JS分为两步:
预解析
(1)预解析:
JS引擎会将JS里面所有的 var(let不会) 还有 function的声明提升到当前作用域最前面
(2) 代码执行
按照代码书写的顺序从上到下依次执行
知识点二:作用域
全局作用域:
直接编写在 script 标签之中的JS代码,都是全局作用域
在全局作用域中有一个全局对象 window(由浏览器创建),可以直接使用。
在全局作用域中
所有创建的变量都会作为 window 对象的属性保存。
所有创建的函数都会作为 window 对象的方法保存
局部作用域(函数作用域):
在函数内部就是局部作用域,这个代码的名字只在函数的内部起作用
调用函数时创建函数作用域,函数执行完毕之后,函数作用域销毁
每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的
经典面试题1:
// <!-- 作用域 -->
// 当全局变量和局部变量同名了,全局变量是不会作用域局部变量的作用域
var a = 10
function test() {
console.log(a)
a = 100
console.log(this.a)
var a;
console.log(a)
}
// 上面代码预解析过程:
// ----------------------------------
// 首先:全局变量
// var a;
// function test() {}
// a = 10
// ------------------------------
// 然后:是function的预解析过程:
// 1、var a;
// 2、 console.log(a) // underfined
// 3、a = 100 (相当于局部的,给a赋值100;var a = 100,
// 局部的a是100,全局的不会作用域局部了,这个时候全局a = 10,局部a =100
// 4、this.a === 10 this的指向是window,所以this.a === 10
// 5、console.log(a) 局部的a是100 ,所以a === 100
test()
// underfined 10 100
经典面试题2:
var a = 10;
function f1() {
var b = 2 * a
var a = 20
var c = a + 1
console.log(b) // NaN
console.log(c) // 21
}
f1()
// 分析:
// 预解析
// var a;
// function f1() {}
// a=10;
// ----
// f1()执行解析过程
// 预解析
// var b; // underfined
// var a; // underfined
// var c; // underfined
// b = 2 * a // underfined * 2 = NaN
// a = 20 // 20
// c = a+1 // 21
// console.log(b)
// console.log(c)