首页 > 代码库 > 你不知道的javascript--上卷--读书笔记1
你不知道的javascript--上卷--读书笔记1
-
作用域是什么?
答:在《你不知道的javascript》书中提到,作用域就是根据名称查找变量的一套规则。古语有“无规矩不成方圆”,但是没有方圆,规矩又给谁用?所以个人理解作用域就是“规矩”+”方圆“。作用域是在创建的时候就确定的。
-
谁有作用域?
答:全局,函数。
-
为什么要有作用域?
答:前面已经说了,作用域是“规矩”+“方圆”。作用域的最大用处就是隔离变量,不同作用域下同名变量不会有冲突。举个例子:XXX县下面有一个王家庄,一个李家庄,王家庄和胡家堡各有一个李家,两家都有一个叫小明的儿子,胡家堡的老李家给自家小明说了个叫王小翠的媳妇。胡家堡的李小明很开心,挑了个黄道吉日准备去派处所把小翠的户口迁到自家,试想,如果没有王家庄和胡家堡之分,xxx县派处所的民警就会很懵逼,两个李小明,王小翠户口迁谁家???有了王家庄和胡家堡的区分,这事就很好办了。
-
JS引擎进入作用域会发生什么?
答:JS引擎进入作用域,编译器就会开始工作,它会执行两轮操作(注意:进入不同的作用域都会触发同样的操作,这也是执行环境压栈和出栈的由来):
-
初始化变量 :声明参数并初始化,局部变量声明,函数声明并初始化,将这些变量保存到环境变量对象当中,
- 执行代码:产生执行环境(执行环境在执行时才产生),当变量出现在赋值操作的左侧时进行 LHS 查询,出现在右侧时进行 RHS 查询。(RHS 查询与简单地查找某个变量的值别无二致,而 LHS 查询则是试图找到变量的容器本身,从而可以对其赋值。不成功的 RHS 引用会导致抛出 ReferenceError 异常。不成功的 LHS 引用会导致自动隐式地创建一个全局变量(非严格模式下),该变量使用 LHS 引用的目标作为标识符,或者抛 出 ReferenceError 异常(严格模式下)。如果 RHS 查询找到了一个变量,但是你尝试对这个变量的值进行不合理的操作, 比如试图对一个非函数类型的值进行函数调用,或着引用 null 或 undefined 类型的值中的属性,那么引擎会抛出另外一种类型的异常,叫作 TypeError。)
-
作用域链是什么?
答:当前作用域-->上一级作用域-->...-->全局作用域
-
谁有作用域链?
答:作用域嵌套的时候
-
为什么要有作用域链?
答:首先需要了解一个概念:自由变量:在A作用域中使用的变量x,却没有在A作用域中声明(即在其他作用域中声明的),对于A作用域来说,x就是一个自由变量。
自由变量的取值需要到创建它的作用域,正因为这样,所以才有了作用域链的出现。
书中是这样说的:LHS 和 RHS 查询都会在当前执行作用域中开始,如果有需要(也就是说它们没有找到所需的标识符),就会向上级作用域继续查找目标标识符,这样每次上升一级作用域,最后抵达全局作用域,无论找到或没找到都将停止。举个例子:现实生活中我们经常看到寻人启事(请原谅我举这个令人悲愤的例子),寻找一个人,会在自己家找,自己家没有,会到村,镇,县,市,... 由此会构成一个家-->村-->镇-->县-->市-->...的寻找链。也就是说作用域链的主要目的就是自由变量的取值。
你不知道的javascript--上卷--读书笔记1