函数声明和函数表达式

声明和赋值

js 复制代码
var myName = 'Lily'

上面这段代码可以看成是两行代码组成的:

js 复制代码
var myName //声明部分
myName = 'Lily' // 赋值部分

函数声明

js 复制代码
function foo() {
    console.log('foo')
}

函数foo是一个完整的函数声明,没有涉及到赋值操作

函数表达式

首先,分析下面这段代码

js 复制代码
var bar = function () { 
    console.log('bar')
 }

当执行这段代码的时候,V8在编译阶段会先查找声明语句,你可以把这段代码拆分为下面两行代码

js 复制代码
var bar = undefined
bar = function () {
    console.log('bar')
}

第一行是声明语句,所以V8在解析阶段,就会在作用域中创建该对象,并且将该对象设置为undefined,第二行是赋值/表达式,在编译阶段,V8并不会处理函数表达式,所以也就不会将该函数表达式提升到作用域中了。

变量提升

所谓的变量提升,是指在JavaScript代码执行过程中,JavaScrpt引擎把变量的声明部分和函数的声明部分提升到代码开头的"行为"。

对于变量提升,如果是一个普通变量,变量提升之后都是undefined,如果是声明的函数,那么变量提升之后的值则是函数对象。

在编译阶段,如果解析到函数声明, 那么V8会将这个函数声明转换为内存中的函数对象,并将其放在作用域中。

JavaScript执行流程

  • 首先JavaScript引擎会将代码中声明的变量和函数保存到执行上下文的变量环境中(编译阶段);
  • 然后JavaScript引擎会把声明之外的代码编译为字节码(编译阶段);

输入一段代码,经过编译后,会生成两部分内容:执行上下文(Execution context)和可执行代码。
执行上下文是JavaScript执行一段代码时的运行环境。

  • 最后JavaScript引擎执行"可执行代码"(执行阶段)。

测试题

js 复制代码
var fun = function (x, y) {
    return x - y 
}

function fun (x, y) {
    return x + y
}

console.log(fun(4, 3))

这道题目的最终输出是:1

执行过程分析:

  • 编译阶段,编译第一行代码时,会将变量fun的声明(var fun = undefined)保存在执行上下文的变量环境中;
  • 编译阶段,编译第五行代码时,会将函数fun声明保存在变量环境中,此时函数名fun与变量名fun重名,所以fun会被重新声明为函数对象。
  • 编译阶段,将声明之外的代码编译成字节码
  • 执行阶段,执行第一行代码时,将变量fun赋值为function(x, y) { return x -y }
  • 执行阶段,执行第五行时声明语句,应该不会编译为可执行代码
  • 执行阶段,调用fun函数,
  • 所以最终输出为1
相关推荐
Revolution611 小时前
一段 JavaScript 代码执行时,到底发生了什么
前端·javascript
To_OC10 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
To_OC12 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
小林ixn12 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
এ慕ོ冬℘゜13 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
随心点儿13 小时前
js postMessage 实现跨域发送消息-应用示例
javascript·ecmascript·postmessage
kyriewen15 小时前
我让AI改一个bug——它偷偷动了5个我没让它碰的地方
前端·javascript·ai编程
gis开发之家19 小时前
《Vue3 从入门到大神35篇》Vue3 源码详解(五):effect 依赖收集原理——track 与 trigger 是如何工作的?
javascript·typescript·前端框架·vue3·vue3源码
橘子星20 小时前
我一个前端切图仔,凭什么能在浏览器里跑大模型?
前端·javascript·前端框架
半个落月20 小时前
用 LangChain JS 做可控写作实验:理解温度参数、提示词与异步调用
javascript·人工智能·后端