js代码由浏览器的js解释器来执行,解析共分为2个步骤:预解析和代码执行。
<mark>预解析规则:</mark>
1. 把变量的声明提升到调用这个变量的最前面,只会提升声明,不会提升赋值。
2. 把函数的声明提升到调用这个函数最前面,只会提升声明,不会提升调用。
3. 先提升var(变量),再提升function(函数)。需要注意变量名与函数名同名的情况,最好避免。
预解析过程总是把声明提到调用的最前面。
```js
// 不声明直接调用——报错
console.log(num);
// 先调用,再声明——undefined
console.log(x); // undefined
var x = 100;
/*相当于:
var x; // 1. 先声明变量x
console.log(x); // 2. 调用变量x,但未赋值
x = 100; // 3. 对变量x赋值
*/
var a = 25;
function abc (){
alert(a);//undefined,调用其实是函数内部的a
var a = 10;
}
abc();
/* 上面代码预解析的过程为:
var a; // 声明变量a,函数外面的a
a = 25; // 对a赋值,函数外面的a
function abc(); // 声明函数abc
abc(); // 调用函数
var a; // 声明变量a,函数内部的a
alert(a); // 函数内部的a
a = 10;
*/
console.log(a); // 25
function b() {
console.log('aaaaa');
}
b(); // aaaaa
var b = 1;
console.log(b); // 1
```
<br/>
```js
// 1、-----------------------------------
var num = 10;
fun();
function fun() {
console.log(num); // undefined,调用的其实是函数内部的num
var num = 20;
}
//2、-----------------------------------
var a = 18;
f1();
function f1() {
var b = 9;
console.log(a); // undefined
console.log(b); // 9
var a = '123';
}
// 3、-----------------------------------
f1();
console.log(c); // 9
console.log(b); // 9
console.log(a); // 报错
function f1() {
var a = b = c = 9; // 相当于var a=9; b=9; c=9; // c和b是全局变量
//var a=9, b=9, c=9; 相当于var a=9; var b=9; var c=9;
console.log(a); // 9
console.log(b); // 9
console.log(c); // 9
}
```
<mark>js代码执行过程</mark>
全局预解析 -> 执行全局代码 -> 遇到函数 -> 对函数内部预解析 -> 执行函数内部代码 -> 执行全局代码。
- js应用场景
- js组成
- js书写位置
- 浮点数精度问题
- undefined与null的区别
- 数据类型转换
- 运算符优先级
- 代码调试
- 函数
- 函数的定义和调用
- 函数的return细节
- 函数是一种数据类型
- this的指向
- 函数成员
- 函数闭包
- 作用域
- 预解析
- js对象
- 对象的创建与调用
- new关键字
- this关键字
- 构造函数创建对象
- 事件
- 数据类型
- 继承
- 杂项
- 如何阻止标签的默认行为
- 为一个标签绑定或移除任何一个事件
- 如何阻止事件的冒泡行为
- 事件的三个阶段
- 移动元素的条件
- 匀速动画函数封装
- 变速动画函数封装
- 获取元素的css属性值
- 数据类型判断方法
- 创建对象的7种写法
- 如何继承
- 为js内置对象添加原型函数
- 将局部变量转换为全局变量
- call函数的用法
- 沙箱
- 浅拷贝
- 深拷贝
- 对象赋值会改变对象
- 解析URL中的字符串
- 格式化日期
- 获取当前浏览器类型
- Vue3.x
- 调式工具Vue Devtools