预解析
含义:不是教你怎么写代码,而是告诉你写代码的执行机制,和不要怎么写代码
预:预先,在所有代码执行之前
解析:解释,对代码精选通读或解释(只是把整体代码当成一个文档)
比如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>
这段话不是代码,这就是一堆文档,跟你写Word文档没有任何区别,就算把这段话放到txt文档里,他也只是一段文本,只有当他在浏览器或者对应的解析引擎里的时候它才是代码,否则它就是一段文本,在编辑器里,只有当他运行起来的时候,他就是一段代码了
解释了什么东西
1. var关键字
- 会把
var关键字定义的变量在代码执行之前声明
这里一共有两个操作
var numnum = 100当代码在浏览器执行的时候,在所有代码执行之前,会先把声明做好,这就是预解析给我们做的第一件事,也就是说,提前告诉浏览器,我定义了一个num变量存在,你可以使用,只是还没有进行赋值,当代码执行到var num = 100这一行的时候,才开始赋值
比如说:
这段代码没有问题,但是如果把
console.log(num)放到声明变量前面的时候
这个时候告诉浏览器我声明了变量
num 所以第一个打印的结果是undefined,接着后面进行赋值,所以第二个打印的结果就是100,但如果我不声明var num = 100这句话的话
浏览器就会报错
真实的代码执行过程:
var numconsole.log(num)num = 100console.log(num)
2. 声明式函数
- 会把这个函数名在所有代码执行之前声明,并且赋值为一个函数
这个代码能执行出来是因为
带第一句代码执行以前,红色框子这串代码已经通过预解析告诉了浏览器这是一个fn函数,所以能正常执行
真实的代码执行过程:
function fn(){console.log('我是 fn 函数')}fn()
3.赋值式函数
按照 var 的规则规则进行解析var fn = function(){}
报错了是因为:
在第一段代码执行的时候,只是有了一个fn,只有方框里的那串代码来到了最前面,所以会报错fn is not a function因为fn是一个undefined它不是function,又要把它当作function来使用,所以会报错。
注意: 声明式函数可以先定义,后定义,而赋值式函数只能后调用
真实的代码执行过程:
var fnfn()fn = function(){}fn()
结论
预解析就是只做这两件事情:
var关键字
- 会把
var关键字定义的变量在代码执行之前声明
- 声明式函数
- 会把这个函数名在所有代码执行之前声明,并且赋值为一个函数