avatar
Published on

《你不知道的javas》读书笔记#1——作用域与闭包

Authors
  • avatar
    Name
    papapatrick
  • 一名普普通通的软件工程大二学生 at 浙江工业大学

第一章 作用域是什么

在了解作用于是什么之前,这本书简单的介绍了下JavaScript是怎么编译和执行的,我用自己的话说一遍,首先是进行词法的分析,就是编译器把我们写的代码按照一定规则拆解成一个个的此法单元(token)例如 “var” “=”等,然后依靠程序语法将这些词法单元变为可执行的代码,即生成电脑可以执行的指令(例如创建一个变量并令它的值为2)交给引擎完成。

而作用域在其中的作用就是作为一个规则,规范一个变量可以在那里被访问,修改,以至于不会乱套,这里介绍了一对比较重要的概念,就是引擎在遇到一个变量名称的时候他会执行LHS查询和RHS查询,前者是在当前的词法作用域下找有没有叫这个名字的变量,如果没有就创造一个(在不严格模式下),而后者比前者多了个查询这个变量的内容的步骤,并且如果没有就会报错。 注:在定义一个函数的时候,之前我一直以为是把这个函数的内容赋值给了一个变量,让他拖着内容,但是这是错误的,我现在更偏向于函数名更像是一个传送门把变量传送到定义的地方(所以函数的作用域在定义时就已经确定了,不像this一样是动态作用域)

第二章 词法作用域

个人觉得这章没什么好讲的,就多了个词法作用域的查找规则——可以向上但不可以向下,然后可以通过window.a 的形式在任意地方访问全局变量,然后函数的作用域我在第一章的注中也作了说明,其他的像修改词法作用域我现在只是看了一遍,目前没觉得这玩意有啥用,还有一些什么程序优化的,我觉得对于现在的我来讲有点超前了。

第三章 函数作用域和块作用域

函数作用域像气泡一样包裹着一个个像变量名,函数名的标识符,这里介绍了匿名函数和立刻执行函数,匿名函数没什么好说的,立刻执行的话就是通过用括号包裹函数把函数的定义变成了函数表达式,立刻执行他,并在后面的括号中传入参数

块作用域,这是非常方便的一个规则,可以把一个变量绑定在单单一个作用域中,让程序更稳定,我觉得需要注意的有let和const,他俩应该放在块开始的地方因为他不会提升到最前面定义。块作用域还可以优化性能,比如让较大数据的处理单独隔离出一个作用域,在执行后可以直接销毁,防止被闭包包裹一直保存。

第四章 提升

这也没啥好说的,就是定义变量的时候,编译器会把定义语句提前,赋值语句(包括把函数赋值给变量)位置不变,并且函数比变量定义的优先级高

第五章 作用域与闭包

一句话:当函数可以记住并访问所在的词法作用域,即函数在当前词法作用域之外执行,就产生了闭包,也就是在函数的作用域之外引用(并保存了???)了函数所在的作用域。

闭包的使用非常的广泛,常见的回调函数就是闭包,并且我们使用的立刻执行函数也会创建一个闭包(不能被外界访问)关闭了一个作用域

我想我们可以用一个循环示例说明

for (var i=1;i<5;i++)  
{  
    let j=i;  
    setTimeout(function timer()  
    {  
        console.log(j);  
    },j1000);  
}

在上面的示例中,每次for循环都创建了一个新的作用域然后用j对每个闭包所引用的(保存)作用域进行了绑定,使得每个settimeout的闭包都有正确的j以供访问,不同于var的单单创建赋值,如果使用了var的话,由于回调函数是在循环执行后做的,那么每个闭包引用的作用域中的j都是5了

最后再加上一个立刻执行写的循环

for(var i=1;i<5;i++)  
{  
    (function (j)  
    {  
        setTimeout(function timer()  
        {  
            console.log(j);  
        },j*1000)  
        })(i)  
}

除了回调函数,对于闭包的运用还有模板就是通过闭包的独立特性,创建多个属性相同的实例 ,由于闭包产生的条件,模板中必须返回一个内部函数!!也就是return 函数 如

// 标准的闭包函数
function A(){
      var i=0;
      return function b(){
              return (++i);
      };
};

var v=A();
v();    //1 不需要用v.b()访问
v();    //2

另外,我们现在也可以用import标识符从其他文件引入并绑定一个模板到当前的作用域中,

写在最后:

其实这本书(上)已经快看完了,现在看下来的最大感受是JavaScript是非常优美的语言,给我的感觉非常轻盈,灵活。很多内部细节还是非常耐人寻味,值得推敲的,推荐大🔥都买一本来看看。另外,这个系列我主要用来记录自己的思考,是作为个人总结,所以教学属性不是很强,看不懂可以来问我:)