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


    • 作用域是什么?

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

        书中提到作用域共有两种主要的工作模型。第一种是词法作用域,另外一种叫作动态作用域。

        词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变(大部分情况下是这样的)。无论函数在哪里被调用,也无论它如何被调用,它的词法作用域都只由函数被声明时所处的位置决定。。

        欺骗词法作用域有两种方法:eval(...)(非严格模式),with(...);

    • 谁有作用域?

      答:全局。

        函数:本质上,声明在一个函数内部的变量或函数会在所处的作用域中“隐藏”起来,外部作用域无法访问包装函数内部的任何内容。

        块作用域:指的是变量和函数不仅可以属于所处的作用域, 也可以属于某个代码块(通常指 { .. } 内部)

    for (var i=0; i<10; i++) {
    console.log( i );
    }

    上述代码中,我们只是想定义一个在for内部使用的i变量,但事实上i变量已经污染到了整个作用域,所以从表面上看,JS并没有块作用域的相关功能。但我们深入研究呢?

    with:用 with 从对象中创建出的作用域仅在 with 声明中而非外 部作用域中有效。

    try/catch:catch 分句会创建一个块作用域,其中声明的变量仅在 catch 内部有效。

    ES6:let:let 关键字可以将变量绑定到所在的任意作用域中(通常是 { .. } 内部)。

       但是由于 let 声明附属于一个新的作用域而不是当前的函数作用域(也不属于全局作用域), 当代码中存在对于函数作用域中 var 声明的隐式依赖时,就会有很多隐藏的陷阱,如果用 let 来替代 var 则需要在代码重构的过程中付出额外的精力。

        const:可以用来创建块作用域变量,但其值是固定的 (常量)。之后任何试图修改值的操作都会引起错误。

    • 为什么要有作用域?

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

        2.最小特权原则:在软件设计中,应该最小限度的暴露必要内容,而将其他内容都“隐藏”起来,比如某个模块或对象的 API 设计。

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

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

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

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

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

    • 谁有作用域链?

      答:作用域嵌套的时候

    • 为什么要有作用域链?

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

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

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

      

    博客搬家:三小山的个人博客

    如有不对,欢迎指正,谢谢
  • 相关阅读:
    [WinAPI] API 13 [遍历指定目录 打印文件和其他属性]
    2014-3-12 星期三 小雨 [及时完成不堆积]
    2014-3-11 星期二 晴 [卓有成效 master 摸索计划方案]
    [ACM_几何] UVA 11300 Spreading the Wealth [分金币 左右给 最终相等 方程组 中位数]
    [ACM_水题] UVA 11729 Commando War [不可同时交代任务 可同时执行 最短完成全部时间 贪心]
    [ACM_水题] UVA 11292 Dragon of Loowater [勇士斗恶龙 双数组排序 贪心]
    [WinAPI] API 12 [获取程序所在的目录、程序模块路径,获取和设置当前目录]
    [WinAPI] API 11 [创建目录]
    [WinAPI] API 10 [创建、打开、读写文件,获取文件大小]
    java解析json数组
  • 原文地址:https://www.cnblogs.com/sanxiaoshan/p/6657508.html
Copyright © 2020-2023  润新知