获取中...

-

Just a minute...

最近在补js基础。当初自学js的时候,总是感觉学的不扎实。只能说不去上手,再怎么死读书,也理解不了。积累了经验,然后自己去思考,这个时候再去看理论,就容易理解了。

感觉工作一年以来,确实学到了很多,但是过于专注于应用方面的知识,反倒基础上有些东西忘记了。虽说平时写代码多半没什么影响,但是基础扎实,才能让你知其所以然。搞技术的永远不能放弃对“知其所以然”的追求。

本篇文章小目标是当一个自己的笔记,免得过段时间又忘了。大目标就是写的详细一点,能让更多的人知其所以然

最精简的结论:

js作用域是静态作用域(词法作用域),在定义的时候就已经确定了。

而执行上下文,顾名思义是运行时的东西,要看是谁调用了谁。

todo 作用域和执行栈的画图解释,闭包,作用域的分类(全局script作用域,模块作用域)。js执行两阶段,活动对象等等

浅谈作用域和作用域链

当访问变量时,js引擎会首先在当前作用域找这个变量,找不到就沿着作用域链向上找,直到全局作用域。沿着作用域链能找到的变量,就可以访问。沿着作用域链找不到的,就不能访问。

js的作用域是静态作用域(也叫词法作用域),在定义的时候就已经被确定了,也就是说,要以代码被定义时的层级,作为作用域链。与之相对的是动态作用域,要以代码被调用的层级来作为作用域链(现代编程语言多数为静态作用域)

举个例子,

1
2
3
4
5
6
7
8
9
10
11
12
let a = 1

function fun1(){
let a = 2
const f= function fun2(){
console.log(a)
}
return f
}

const result = fun1()
result()

这段js代码,打印出来的是2,因为fun2内部访问a的时候,沿着作用域链寻找,作用域链是按定义的层级来的,所以会找到fun1里面的a,而不是全剧最外面的a。

如果是动态作用域,那么会打印出来1,因为调用f的环境是在全局。

执行栈

js调用函数,是以栈的形式去实现的。有一个执行环境的栈,栈里面每一个元素都是一个执行上下文。至于什么是执行上下文,后面会详细讲解,可以简单理解为包含了函数执行相关信息,比如入参,和里面定义的变量等等。

最初的执行栈就只有一个元素,就是全局上下文。然后如果调用了别的函数,就会创建一个新的上下文,并且推入栈中,如果在函数内又调用了函数,就继续创建新的上下文并入栈。当函数执行完毕,这个函数的上下文就出栈。

这就是很基本的执行栈规则

很忙,有空再更新

相关文章
评论
分享
  • 动手实现react-ssr 2

    仓库链接:本篇代码 运行方法参考readme,请使用pnpm,因为本次使用的rspack尚未推出1.0版本,预计后续可能会有很多breakchange,所以lock文件至关重要,而我只上传了pnpm的lock,非常抱歉。 环境:no...

    动手实现react-ssr 2
  • 动手实现react ssr

    关于ssr相关的介绍,可以移步之前的一篇博文,本文不再赘述 日常工作中,我们可能都接触过ssr,不过我们可能通常是借助于框架(例如Next.js)的支持来完成ssr。今天我想尝试,摆脱高度封装的前端框架,只依赖react相关的库,来实...

    动手实现react ssr
  • 基于tapable来模拟webpack插件机制

    前两天看到ByteFE公众号发了篇文章,从源码去讲webpack。我之前也从很多方面去学习webpack,只是源码一直没太看得进去,这一次我想仔细地读一读。 简要介绍tapable说实话,之前看webpack源码一直没看的太懂,...

    基于tapable来模拟webpack插件机制
  • webpack运行时代码简要分析

    开个坑,主要也是怕自己后面忘了 简单写写,有空了补上 __webpack_modules是一个数组,每个元素都是一个函数,函数接受三个参数:第一个参数module好像没用到,第二个是一个对象(会把本模块要导出的属性,赋值给这个对象),...

    webpack运行时代码简要分析
  • webpack动态加载原理简述

    为什么需要动态加载上一篇讲我写webpack针对markdown的loader的时候,提到了希望能动态加载以优化性能。篇幅原因没有展开说,打算单独写一篇文章讲一下。 当我们访问网站的时候,浏览器会向服务器请求页面资源。首先请求的当然是...

    webpack动态加载原理简述
  • 编写一个简单的webpack loader的踩坑

    因为觉得hexo框架搭的博客功能一般,就有了想要自己写一个博客的想法。然后就想着如果把markdown文件也放到项目里的话,会比较方便,发现需要编写一个加载markdown的loader,于是就有了这篇博客,来记录一下踩过的坑和收获...

    编写一个简单的webpack loader的踩坑
  • 简单通俗解释HTTP缓存

    开始前的碎碎念 最近加班真的很严重,组里同事们都已经苦不堪言。业务交付压力非常大,根本没时间去磨练本领,学习技术。真的很讨厌这种没有成长的日子,每天被业务需求赶着跑。每天下班之后,本来应该用于提升自我的时间也被压榨用来写业务代码。 ...

    简单通俗解释HTTP缓存
  • 从invalid hook call报错说到npm install相关

    遇到了invalid hook call报错上周,业务下游的同事反馈了一个生产问题,说我们传的值有问题,领导让我帮忙排查一下。我最近一直没做那个项目相关的需求,打开那个项目切到release分支,拉代码,npm i然后启动,结果就白屏...

    从invalid hook call报错说到npm install相关
  • useState为什么获取不到更新后的值,如何解决

    令人困扰的问题是因为异步吗大家都知道,react的useState和useReducer,在set和dispatch之后,马上去获取值,是拿不到最新的值的。这个原因之一是useState和useReducer是异步更新的,也就是说我们...

    useState为什么获取不到更新后的值,如何解决
  • 发布一个npm包的踩坑

    试着自己发布了一个npm包,记录一下自己踩的坑 package.json首先npm init,然后添加type:module字段,将其定义为一个es6模块。然后在files字段设置要发布上去的内容,比如dist文件夹。 接下来将开发用...

    发布一个npm包的踩坑
Please check the parameter of comment in config.yml of hexo-theme-Annie!