![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
javascript
饼小将
想要很多,所以要努力。
展开
-
JS Promise 详细理解过程
学习 Promise 的建议在本人一开始学 Promise 时也是看了很多热门的 Promise 文章讲解,但是说实话很多都是自己吸收不进去的,跌跌撞撞也走了许多弯路,凭借着自己一点点的理解和感悟整理出了这一篇学习和理解 Promise 的文章。我将从我自己理解的角度和过程会详细讲述 Promise 的理解过程。在学习 Promise 时,我认为需要比较扎实和牢固的JS基础,例如要熟悉词法作用域规则、this规则、熟练闭包、熟练使用回调函数。否则学起来可能会不懂和吃力,毕竟学习技术都是一步步一级级上升原创 2020-09-22 23:15:27 · 387 阅读 · 0 评论 -
你不知道的JS(上卷)——读书笔记8 this全面解析
this全面解析首先,需要找到调用函数的位置,例子代码如下:function foo() { // 调用栈:全局->foo console.log('foo'); bar();}function bar() { // 调用栈:全局->foo->bar console.log('bar'); baz();}function baz() { // 调用栈:全局->foo->bar->baz conso原创 2020-09-06 21:07:31 · 262 阅读 · 0 评论 -
你不知道的JS(上卷)——读书笔记7 关于this
关于thisfunction identify() { return this.name.toUpperCase();}function speak() { var greeting = 'Hello,我是' + identify.call(this); console.log(greeting);}var me = { name: 'Kyle'}var you = { name: 'Reader'}identify.call(me); //KYL原创 2020-09-05 20:35:39 · 134 阅读 · 0 评论 -
JS经验积累笔记
这里记录着一些我自己在学JS中的积累var重复声明同一个标识符并不会报错,而且重复声明赋值会覆盖。let重复声明会报错访问一个已经声明的对象的未声明的成员(如window.a),并不会报ReferenceError错误,而是显示underfined。并不是因为隐式自动声明了一个变量成员:console.log(window.a); //underfinedconsole.log(a); //报错:ReferenceError如果window.a时隐式声明了a,那么在之后的log(a)中原创 2020-09-05 10:20:49 · 150 阅读 · 0 评论 -
你不知道的JS(上卷)——读书笔记6 动态作用域、块作用域的替代方案、this词法
附录A动态作用域大部分语言都是基于词法作用域,JS也是词法作用域词法作用域是在代码编写时就已经确定好了的(取决于代码编写的位置),除了eval和with而动态作用域关心的是函数在何处被调用总结来说,动态作用域的作用域链是基于调用栈的(函数的调用栈),而词法作用域的作用域链是基于作用域的嵌套附录B块作用域的替代方案想要在ES6之前只用块作用域,可以使用catch:try{throw:2;}catch(a){ console.log(a); //2}这段代码虽然可以达到块作用域的效果,原创 2020-09-04 21:04:43 · 144 阅读 · 0 评论 -
你不知道的JS(上卷)——读书笔记5 作用域闭包
第五章闭包在JS中无处不在,我们需要的是能够识别、理解并能灵活运用它function foo(){ var a = 2; function bar(){ console.log(a); //2 } bar();}在上述代码中,是一个属于闭包的简单例子,但是并不能最好的代表闭包所表现出来的作用,借用书中的一句话:这是闭包吗?技术上来讲,也许是。但根据前面的定义,确切地说并不是。我认为最准确地用来解释bar()对a的引用的方法是词法作用域的查找规则,而这些规则只是闭包的一部分。(但却原创 2020-09-04 20:35:20 · 117 阅读 · 0 评论 -
你不知道的JS(上卷)——读书笔记4 提升
第四章声明的变量和函数,在编译阶段前,会把声明提升到作用域最前面,例如:a = 2;var a;console.log(a); //2根据提升规则,声明的a变量会提升到最前面,所以打印出的结果是2上述代码可当做如下代码:var a;a = 2;console.log(a);同样,有如下代码:console.log(a); //underfineda = 2;等同于下面代码:var a;console.log(a); //underfineda = 2;原创 2020-09-03 17:04:20 · 120 阅读 · 0 评论 -
你不知道的JS(上卷)——读书笔记3 函数作用域和块作用域
第三章函数中的作用域众所周知,JS中的函数可以当做一个作用域,在该作用域里面定义着标识符(变量)以及函数,函数作用域之间又可以嵌套。函数作用域的含义是指,属于这个函数的全部标识符都可以在整个函数的范围内使用以及复用(包括在嵌套的作用域中),这种设计能充分利用JS的动态特性(静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行的时候,待变量被赋予某个值之后,才会具有某种类型)隐藏内部实现把代码片段用一个函数包裹起来(创建新的函数作用域),可以隐藏其在原来该函数位置的访问。好处是原创 2020-09-02 22:01:56 · 147 阅读 · 0 评论 -
你不知道的JS(上卷)——读书笔记2 词法作用域
第二章词法作用域JS语言是词法作用域(除此之外有的语言是动态作用域),其意思是作用域由你写的代码(变量、块作用域)所在的位置来决定的,在词法分析器处理代码时会保持作用域不变(有些例外情况)由于作用域嵌套的规则,使得找到指定的标识符(变量)需要从当前的作用域开始找,逐级向上进行查找,当查找到变量后便停止查找遮蔽效应:根据刚才规则,只要在里层作用域创建相同名字标识符,就可以使外层作用域的变量不会被访问到。但是由于声明的全局变量会自动成为全局对象(比如window对象)的属性,所以可以直接通过全局对象的属原创 2020-09-02 18:01:34 · 115 阅读 · 0 评论 -
你不知道的JS(上卷)——读书笔记1 作用域是什么
第一章作用域根据名称来查找变量的一套规则编译传统编译:代码在执行前会经历三个步骤,统称为编译分词/词法分析:把代码分为代码块(词法单元)解析/语法分析:把词法单元(数组)转换成由元素嵌套组成的代表了程序语法的树(抽象语法树AST)代码生成:根据AST生成可执行的代码JS编译:JS的编译过程还包括了性能优化等操作。JS的编译过程发生在代码执行之前,编译后基本上代码立即执行编译过程的参与者:引擎:负责整个JS程序的编译和执行过程编译器:负责语法分析及代码生成作用域:负责收集和维护所原创 2020-09-02 16:42:27 · 131 阅读 · 0 评论