一道题引发的思考

本文详细解析了JavaScript的预解析过程,阐述了变量声明、函数定义以及执行上下文的创建。通过一个实例展示了函数内部与全局作用域的关系,解释了函数内部开辟的栈空间如何存储预解析结果,并讨论了变量提升(hoisting)和作用域链的概念。同时,深入探讨了arguments对象和原型在函数堆空间中的位置和作用。
摘要由CSDN通过智能技术生成

在这里插入图片描述
js先会预解析,在栈中:
|test| ⇐ 堆 {函数对象}
|a|undefined
|b|undefined
|c|undefined


,执行到a=10,b=11,c=12:
|test| ⇐ 堆 {函数对象}
|a|10
|b|11
|c|12


,执行到test(1);
c:12(全局栈),
函数栈预解析
|a|undefined
|b|undefined


,执行到:

function test(a)

,函数对象的栈:
|a|1
|b|undefined


,执行到a=1,
,函数对象的栈:
|a|1
|b|undefined


,执行到var b=2;
,函数对象的栈:
|a|1
|b|2


执行到c=3;
全局对象的栈:
|a|10
|b|11
|c|3


,执行结束test(1);
console.log(a,b,c);
相当于

console.log(console.log(a,b,c));//外层console.log()是浏览器加的。console.log()无返回值,所以自己的返回undefined.

所以打印:

10 11 3
undefined

函数内部会开辟一个单独的栈空间用于存储预解析的结果。
{a=1;var b=2;c=3;}不光把这些存到堆中,函数的堆空间中还有arguments,[prototype]等对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值