JavaScript学习——prototype原型和作用域(3)
好记性不如烂笔头,在写作的过程中自己消化吸收,所以写下这个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会声明一个劫持...的变量,还不太理解这句话。。。
以上细节也很重要,摘下来背诵。下篇讲作用域链
上一篇: Spring Bean的作用域之prototype
下一篇: Spring 属性注入方式
推荐阅读
-
前端综合学习笔记---变量类型、原型链、作用域和闭包
-
前端学习笔记三:JavaScript(2)变量的分类和作用域+利用浏览器调试模式测试+HTML事件+表示特殊字符(+运算符+各种循环和条件语句【略】)
-
JavaScript学习——prototype原型和作用域(4)
-
JavaScript学习——prototype原型和作用域(3)
-
Javascript学习笔记3 作用域_基础知识
-
前端综合学习笔记---变量类型、原型链、作用域和闭包
-
Javascript学习笔记3 作用域_基础知识
-
JS学习3(变量、作用域和内存)
-
跟我学习javascript的prototype原型和原型链_javascript技巧
-
跟我学习javascript的prototype原型和原型链_javascript技巧