ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
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> 全局预解析 -> 执行全局代码 -> 遇到函数 -> 对函数内部预解析 -> 执行函数内部代码 -> 执行全局代码。