js作用域笔记

1. 作用域 存储变量的规则被称为作用域
2. 词法单元(token) 把字符串分解成有意义的代码块,这些代码块被称为词法单元 var a=2;分解var,a,=,2,;
3. 词法分析(lexing) 词法单元生成器在判断a是一个独立语法单元还是其他词法单元的一部分时,调用的是有状态的解析规则,那么这个过程被称为词法分析.
4. LHS和RHS的含义是”赋值操作的左侧或右侧”并不一定意味着就是”=赋值操作符的左侧或右侧”.赋值操作还有其他几种形式,因此在概念上最好理解为”赋值操作的目标是谁(LHS)”以及”谁是赋值操作的源头(RHS)”.
a) 示例:console.log(a)这是一个RHS引用,因为他没有赋值需要去查找源头
b) a = 2 这里对a的引用就是LHS引用.不关心值只想要为=2这个赋值操作找一个目标
c) 个人理解,(var a)有变量没值是RHS
d) (var a = 10)||(a = 10)有值没变量是LHS
5. 作用域嵌套 当引擎从当前的执行作用域开始查找变量就会想上一级查找.直至最外层的全局作用域,如果还是没有就会停止
6. 异常 严格模式下 ReferenceError同作用域判断失败相关 TypeError则代表作用域判断成功但是对结果的操作是非法或不合理的
7. [严格模式下无法修改]欺骗词法 eval() 可以用来执行动态创建的代码,对一段包含一个或多个声明的 代码 字符串进行演算,并借此修改以存在的词法作用域 [性能影响]


function foo(str){
eval(str);
console.log(a);//2
}
foo(“var a = 2”);

8. 欺骗词法 with 可以用来修改对象的属性,重复引用同一对象的多个属性的快捷方式,可以不需要重复引用本身[性能影响]
9. 函数声明: var a = function(){} 函数表达式function a(){}
10. 匿名和具名
a) 匿名
setTimeout(function(){console.log(“I w I”);},1000)
b) 具名
setTimeout(function times(){console.log(“I w I”);},1000)
c) 匿名函数在栈追踪中不会显示有意义的函数名,调试困难,如果没有函数名,但函数引用自身只能使用过期的arguments.callee引用
11. 立即执行函数表达式 以括号将函数表达式括起,然后再写个括号调用
12. 声明优先级
a) 所有的声明(变量和函数)都会被移动到各自作用域的最顶端
b) 在js中所有函数声明和变量声明都会被提示,函数声明会首先提升,然后才是变量
13. 避免var(变量)声明和函数声明重复
14. 遮蔽效应 作用域查询会从最内部的作用域开始,逐级向外,遇见第一个匹配的标识符停止.通过window.变量名可以访问全局作用域中被遮蔽的标识符,如果是非全局的变量被遮蔽了,无论如何都无法被访问到

分享 二维码
分类:代码笔记
还没有评论


在此输入评论..
0/100