js的编译和执行简述

240 阅读1分钟

1.变量提升

案例:

showName()
console.log(myname)
var myname = '变量赋值'

function showName() {
    console.log('函数执行');
}

执行结果

函数执行
undifined

模拟变量提升

/*
 * 变量提升部分
 */
// 把变量 myname提升到开头,
// 同时给myname赋值为undefined
var myname = undefined
// 把函数showName提升到开头
function showName() {
    console.log('函数执行');
}

/*
 * 可执行代码部分
 */
showName()
console.log(myname)
// 去掉var声明部分,保留赋值语句
myname = '变量赋值'

所谓的变量提升,是指在 JavaScript 代码执行过程中,JavaScript 引擎把变量的声明部分和函数的声明部分提升到代码开头的“行为”。变量被提升后,会给变量设置默认值,这个默认值就是我们熟悉的 undefined。

2.js代码执行流程

(1)编译阶段
代码会被编译成执行上下文和可执行代码

(2)执行阶段 执行阶段,javascript引擎会去从变量环境中去查找变量和函数,并执行

3.词法作用域

词法作用域浏览器维护的一个小型栈,像调用栈一样,每编译一次就往栈中推入当前函数或者块作用域种let或const定义的变量,当执行内部代码再次遇到块级作用域时,将其中let或者const的变量推入栈中。变量查询的过程,是,先从词法作用域的栈顶向栈底查找,如果找到直接返回,如果未找到,则从变量环境中继续查找。