JavaScript中的几个预解析问题。
-
什么是预解析?
预解析即将代码提前解析。JavaScript的代码是以从上到下的顺序依次执行,如果使用变量或者调用函数时,定义变量语句在使用变量语句后面执行,定义函数语句在调用函数语句后面执行,会将定义变量,定义函数提前到使用变量和调用函数的语句前。例1:在控制台输出number的值
<script> var number = 10; console.log(number); //number=10 </script>
<script> console.log(number); //undefined var number = 10; </script>
将上述代码进行对比,number变量定义在输出代码console.log()前,并且输出number=10,number定义在输出代码console.log()后面,则需要预先对number变量的定义进行预解析,即将number变量的定义提前到console.log()代码前,但不赋值,因此代码执行后输出undefined,并且不会报错。
例2:
<script> var a = 18; f1(); function f1 (){ var b = 9; console.log(a); // undefined console.log(b); // 9 var a = '123'; } </script>
为什么a是undefined而不是18,那是因为JavaScript函数有一个作用链,先执行函数内部的代码, var a = 18 虽然是全局变量,但是对f1()函数不产生影响。因此,var a = ‘123’提前到console.log()函数前定义,所以 a 不是 18 而是undefined。
<script> var a = 18; function f1 (){ var b = 9; var a ; console.log(a); // undefined console.log(b); // 9 a = '123'; } f1(); </script>