码迷,mamicode.com
首页 > 编程语言 > 详细

你不知道的javascript--上卷--读书笔记1

时间:2017-04-01 21:54:06      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:目的   是你   概念   str   操作   undefined   查找   为什么   efi   

  • 作用域是什么?

  答:在《你不知道的javascript》书中提到,作用域就是根据名称查找变量的一套规则。古语有“无规矩不成方圆”,但是没有方圆,规矩又给谁用?所以个人理解作用域就是“规矩”+”方圆“。作用域是在创建的时候就确定的。

  • 谁有作用域?

  答:全局,函数。

  • 为什么要有作用域?

  答:前面已经说了,作用域是“规矩”+“方圆”。作用域的最大用处就是隔离变量,不同作用域下同名变量不会有冲突。举个例子:XXX县下面有一个王家庄,一个李家庄,王家庄和胡家堡各有一个李家,两家都有一个叫小明的儿子,胡家堡的老李家给自家小明说了个叫王小翠的媳妇。胡家堡的李小明很开心,挑了个黄道吉日准备去派处所把小翠的户口迁到自家,试想,如果没有王家庄和胡家堡之分,xxx县派处所的民警就会很懵逼,两个李小明,王小翠户口迁谁家???有了王家庄和胡家堡的区分,这事就很好办了。

  • JS引擎进入作用域会发生什么?

  答:JS引擎进入作用域,编译器就会开始工作,它会执行两轮操作(注意:进入不同的作用域都会触发同样的操作,这也是执行环境压栈和出栈的由来):

  1. 初始化变量 :声明参数并初始化,局部变量声明,函数声明并初始化,将这些变量保存到环境变量对象当中,

  2. 执行代码:产生执行环境(执行环境在执行时才产生),当变量出现在赋值操作的左侧时进行 LHS 查询,出现在右侧时进行 RHS 查询。(RHS 查询与简单地查找某个变量的值别无二致,而 LHS 查询则是试图找到变量的容器本身,从而可以对其赋值。不成功的 RHS 引用会导致抛出 ReferenceError 异常。不成功的 LHS 引用会导致自动隐式地创建一个全局变量(非严格模式下),该变量使用 LHS 引用的目标作为标识符,或者抛 出 ReferenceError 异常(严格模式下)。如果 RHS 查询找到了一个变量,但是你尝试对这个变量的值进行不合理的操作, 比如试图对一个非函数类型的值进行函数调用,或着引用 null 或 undefined 类型的值中的属性,那么引擎会抛出另外一种类型的异常,叫作 TypeError。)
  • 作用域链是什么?

  答:当前作用域-->上一级作用域-->...-->全局作用域

  • 谁有作用域链?

  答:作用域嵌套的时候

  • 为什么要有作用域链?

  答:首先需要了解一个概念:自由变量:在A作用域中使用的变量x,却没有在A作用域中声明(即在其他作用域中声明的),对于A作用域来说,x就是一个自由变量。

  自由变量的取值需要到创建它的作用域,正因为这样,所以才有了作用域链的出现。

  书中是这样说的:LHS 和 RHS 查询都会在当前执行作用域中开始,如果有需要(也就是说它们没有找到所需的标识符),就会向上级作用域继续查找目标标识符,这样每次上升一级作用域,最后抵达全局作用域,无论找到或没找到都将停止。举个例子:现实生活中我们经常看到寻人启事(请原谅我举这个令人悲愤的例子),寻找一个人,会在自己家找,自己家没有,会到村,镇,县,市,...  由此会构成一个家-->村-->镇-->县-->市-->...的寻找链。也就是说作用域链的主要目的就是自由变量的取值。

  

你不知道的javascript--上卷--读书笔记1

标签:目的   是你   概念   str   操作   undefined   查找   为什么   efi   

原文地址:http://www.cnblogs.com/sanxiaoshan/p/6657508.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!