0
点赞
收藏
分享

微信扫一扫

藤原奥利奥的JavaScript学习笔记(一)

伢赞 2022-03-11 阅读 51

开篇提示:此文章来自自己学习JavaScript的笔记,为日后方便巩固知识所做的笔记,因为初学,若笔记中有问题,望海涵,多多指教。

截图来自: W3school中的JS教程

笔记来自:你不知道的JavaScript(上卷)


关于引擎,编译器,作用域

引擎:从头到尾负责整个JavaScript程序的编译执行过程

编译器:负责语法分析代码生成等脏累活

作用域:负责收集并维护由所有声明的标识符(变量)组成的一些列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。


关于作用域

1.块作用域(block scope)

在块作用域中,有两个关键词,let和const可以用来声明块作用域

注意:通过var声明的变量没有块作用域

                                                  

截图来自: W3school中的JS教程

注意:若在块作用域中用var重新声明变量,块作用域外的变量也将改变变量!

解决办法:可以使用let来重新声明变量,let重新声明变量不会影响块作用域外的变量。           

 


JavaScript 函数优先

        我们习惯将var a = 2 ;看作一个声明,

        而实际上JavaScript引擎不这么认为,它会分为var a 和 a = 2 两段声明。

        第一段var a是编译阶段,第二段a = 2是执行阶段。

        每个作用域都会进行提升。

        函数声明和变量声明都会被提升,提升顺序为函数>变量,函数先提升然后再到变量提升。

        提升可以被覆盖,若函数的声明和变量的声明重复了,函数的声明会覆盖变量的声明。

        若函数与函数的声明重复了,后者将覆盖前者。


JavaScript 变量提升

        JavaScript声明提升

                函数及变量的声明都将被提升到函数的对顶部

                变量可以在使用后声明,也就是变脸高可用先使用在声明。

                

        JavaScript 初始化不会提升

                JavaScript只有声明的变量会提升,初始化不会。


JavaScirpt执行环境

执行环境有:  全局环境

                        函数环境

JavaScript的执行是单线程,所以一次只能做一件事,也就是"栈" Stack

作用域链

此处截图来自bilibili 技术蛋老师B站技术蛋老师

                                 


JavaScript编译器 提升

变量和函数在内的所有声明都会在任何代码被执行前首先被处理。

eg:
        var a = 2;

看上去是声明,但在 编译器看来,实际上是 两个声明var aa = 2

第一个 var a 定义声明是在 编译阶段

                    

var a;
a = 2;
console.log( a );

第二个 a = 2赋值声明会被留在原地 等待执行阶段

var a ;
console.log( a );
a = 2;

因此这个过程就好像变量和函数声明从它们在代码中出现的位置被 "移动"了到最上面,

这个过程叫 “提升”。

只有声明本身会被提升,而赋值或其他运行逻辑会留在原地等待执行。

图来自W3school


立即执行函数表达式

    

eg:
    var a = 2 ;
        ( function foo(){
          var a = 3;
            console.log(a)     3
    } )();

            console.log(a);    2

由于函数被包含在一对括号()里,因此成为的表达式,通过在末尾在加上一个括号()可以立即执行这个函数。


举报

相关推荐

0 条评论