变量提升与函数提升

🌸 您好,欢迎您的阅读,等君久矣,愿与君畅谈.
🔭 § 始于颜值 § 陷于才华 § 忠于人品 §
📫 希望我们可以进一步交流,共同学习,共同探索未知的技术世界 稀土掘金 OR GitHub.


# 1 提升

在 j s 代码执行前引擎会先进行预编译,预编 译期间会将变量声明与函数声明提升至其对应作用域的最顶端。

# 2 变量提升

在 ES 6 出来之前,J S 并没有块级作用域这一说,只有全局作用域和局部作用域。变量提升指的是使用 var 声明的变量提升到他所在的作用域的最顶端。创建阶段,初始化阶段变量提升,赋值阶段没有提升,值为 undefined。

* 赋值逻辑不提升
* 全局变量会被局部作用域中的同名变量覆盖

let,con st 变量,在创建阶段被提升了,但初始化和赋值阶段都没有被提升,没法使用变量,都存在一个暂时性死区。

# 3 函数提升

函数声明提升:是将函数名及函数体全部提升到其所在作用域的顶部。

函数创建有两个方式:

1,函数声明形式

1
2
3
4
// 声明式
function foo () {
// to do...
}

2,函数字面量形式(即函数表达式)

1
2
3
4
// 函数字面量
var foo = function () {
// to do...
}

还有一种是方式:函数构造法:var a = new Fun (),技术角度来讲也是一个字面量形式。

函数提升只针对具名函数,而对于赋值的匿名函数,并不会存在函数提升。

# 4 变量提升与函数提升的优先级

函数提升优先级高于变量提升,且不会被同名变量声明覆盖,但是会被变量赋值后覆盖。

# 5 为什么有变量提升

JavaScript 作为脚本语言,不同于编程语言的一点是没有编译过程,但是它需要脚本解释器边解析边执行,而脚本解释器在解释执行代码前会先扫描一遍,这个过程就是 “预解析” 过程。

J S 运行阶段包括预解析阶段和运行阶段。

预解析阶段:

​ 变量提升

​ 函数提升

执行阶段:

​ 创建一个执行上下文 (execution context),函数压栈,生成 active object (活动对象)

​ 执行 / 解释上下文中的 function,为变量赋值

预解析需要注意如下几个问题:

  1. 预编译首先是全局预编译,函数体未调用时是不进行预编译的。
  2. 只有 var 和 function 声明会被提升。
  3. 在所在的作用域会被提升,不会扩展到其他的作用域。
  4. 预编译后会顺序执行代码。

变量提升与函数提升
http://example.com/2022/06/17/4002_JavaScript变量提升与函数提升/
作者
XGG
发布于
2022年6月17日
更新于
2023年6月4日
许可协议