欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript学习——prototype原型和作用域(3)

程序员文章站 2022-05-24 10:50:00
...

        好记性不如烂笔头,在写作的过程中自己消化吸收,所以写下这个JavaScript学习系列文章。文章中的文字都是自己一一敲字敲下来的,都是自己理解的内容,各位酌情观看。

        上一讲原型说完,说说作用域吧。看了大佬的两篇文章【JavaScript深入之词法作用域和动态作用域】【JavaScript深入之作用域链】,看过也没收获下什么,xmind读书笔记就记下了个文章名称和链接,也是醉了。重读!

【概念】

        定义: 作用域是指程序源代码中定义变量的区域。——字面理解;

                     作用域是根据名称查找变量的一套规则。——功能理解

【作用】

        作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。

        作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。

 【扩展】

        JavaScript的作用域:全局作用域、函数作用域、块作用域(ES6+)。全局作用域和函数作用域都比较熟悉,块作用域是什么?

        块作用域是ES6新增规范,由{}包括,if(){... for(){... try{ catch{... with(){... 等都是块作用域。使用let声明的变量只能在块级作用域里访问,具有“暂时性死区”特性

——我理解都一样,块作用域字面意思理解就是一个块,JavaScript中用大括号{}的方式来确定块,函数也是用{}括起来的,也是一个块作用域。

        重要的“公式”:函数作用域的含义是指,属于这个函数的全部变量都可以在整个函数的范围内使用及复 用(事实上在嵌套的作用域中也可以使用)。

例子

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();

        由于作用域机制,两个scope的定义不会引发冲突。记住下面的一句话再看代码都不会回答错:函数的作用域在函数定义的时候就确定了。

        这里函数f定义在函数checkscope的内部,在函数checkscope内部的所有地方都能访问到函数checkscope的变量,所以函数f能访问到内部定义的scope。所以输出是“local scope”。

——如果对this 闭包一知半解,会影响这个问题的解答(不要问我怎么知道的...)。


        为了让自己写的东西更有效(接近真理),我又去读了一下书《你不知道的JavaScript》,获取到的关键知识记录如下:

——看书要带着问题去看,比如我想看懂作用域这块内容,我就专门找很多JavaScript的书去啃相关章节,这样理解也透彻。直接拿着书从头看特别容易犯困,五分钟就着了(不要问我怎么知道的...)

第一部分第1章 作用域

1. JavaScript是门编译语言,在运行前几微秒编译。

 2. 编译过程:以var a =2;为例,编译器会进行如下处理。查找当前作用域(*)下是否有a,有则跳过这条语句继续编译;否则在当前作用域创建名称为a的新变量;=>然后编译出js引擎所运行时需要的代码;=>js引擎处理代码,查找当前域下是否有变量a,有则赋值2,没有则继续查找(在原型链查找)。最终找不到就抛出错误。

注:* ——作用域在编译的时候就已经确定了

第一部分第2章 词法作用域

1.词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写 代码时将变量和块作用域写在哪里来决定的

2.无论函数在哪里被调用,也无论它如何被调用,它的词法作用域都只由函数被声明时所处 的位置决定。

3.词法作用域查找只会查找一级标识符,比如 a、b 和 c。如果代码中引用了 foo.bar.baz, 词法作用域查找只会试图查找 foo 标识符,找到这个变量后,对象属性访问规则会分别接管对 bar 和 baz 属性的访问。

注:*——

第一部分第3章 函数作用域和块作用域

1.函数作用域的含义是指,属于这个函数的全部变量都可以在整个函数的范围内使用及复用(事实上在嵌套的作用域中也可以使用)。

2.区分函数声明和表达式最简单的方法是看 function 关键字出现在声明中的位置(不仅仅是一行代码,而是整个声明中的位置)。如果 function 是声明中 的第一个词,那么就是一个函数声明,否则就是一个函数表达式。

ES6 中引入了 let 关键字(var 关键字的表亲),用来在任意代码块中声明变量。if (..) { let a = 2; } 会声明一个劫持了 if 的 { .. } 块的变量,并且将变量添加到这个块中。

注:*——let会声明一个劫持...的变量,还不太理解这句话。。。

以上细节也很重要,摘下来背诵。下篇讲作用域链