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

        好记性不如烂笔头,在写作的过程中自己消化吸收,所以写下这个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会声明一个劫持...的变量,还不太理解这句话。。。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值