javascript 预解析

所以在正常情况下,变量要使用或函数要调用,都需要提前定义变量或函数。
但我们发现一件比较有意思的事情:先输出变量,然后再定义变量,浏览器不报错;先调用函数,再定义函数,不报错,函数能调用 

原因是浏览器执行js代码之前,会有一个预解析的过程:

浏览器中有一段程序专门用来解析js代码, 叫做js解析器。js解析器在执行js代码的时候,分两步进行:

预解析js代码

预解析的过程,就是查找代码中的var和function这两个关键字,找到以后,将变量和函数提前存到内存中,并给他们赋一个初始值,变量的初始值为undefined,函数的初始值为代码段。

开始按顺序一行一行解读代码

解读代码的时候,会略过变量和函数的定义,因为变量和函数的定义已经提前放在内存中了,提前储存的变量和函数的值会随着代码的解读而发生变化,也就是变量的赋值和函数的调用。

预解析分为变量的预解析和函数的预解析,也就是代码在执行之前先进行解析,将变量和函数的定义放在内存中。

但是在打印之后声名过变量的话,情况就不一样了。


代码执行之前先预解析:
开始按照预解析后顺序执行:


总结

练习题

// 第1题

console.log(num)

var num = 100  un

// 第2题

fn();

function fn() {

console.log(123);

} 123

// 第3题

console.log(fn)  un

fn()

var fn = function () {

console.log(123);

}  123

// 第4题

fun()

var fn = function () {

console.log('我是 fn 函数')

}

function fun() {

console.log('我是 fun 函数')

}

fn()

fn = 100

fn()

// 第5题

fn()

function fn() {

console.log('我是一个 fn 函数')

}

fn()

var fn = 100

fn()

// 第6题

var fun = 200 

fun()

var fun = function () {

console.log('我是一个 fun 函数')

}

fun()

// 第7题

var a = b

a = 0

b = 0

console.log(a)

console.log(b)

// 第8题

console.log(num)

if (false) {

var num = 100

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容