【读书笔记】《你不知道的 JavaScript(上卷)》

描边盛开火玫瑰 python描边盛开火玫瑰 代码如下 import turtle as t t.setup(800,800) t.hideturtle() t.speed(11) t.penup() t.goto(50,-450) t.pensize(5) t.pencolor("black") t.seth(140) t.pendown() t.speed(10) t.circle(-300,60) t.fd(100) #jiaodu80 #1ye t.seth(10) t.fd(50) t.fillcolor("gr 阅读详情

第一部分 作用域和闭包

1.1 作用域是什么?

作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是对变量进行赋值,那么就会使用 LHS 查询;如果目的是获取变量的值,就会使用 RHS 查询。赋值操作符会导致 LHS 查询。=操作符或调用函数时传入参数的操作都会导致关联作用域的赋值操作。

JavaScript 引擎首先会在代码执行前对其进行编译(词法分析->语法分析->代码生成),在这个过程中,像var a = 2这样的声明会被分解成两个独立的步骤:

  1. 首先,var a在其作用域中声明新变量。这会在最开始的阶段,也就是代码执行前进行。
  2. 接下来,a = 2会查询(LHS 查询)变量 a 并对其进行赋值。

LHS 和 RHS 查询都会在当前执行作用域中开始,如果有需要(也就是说他们没有找到所需的标识符),就会向上级作用域继续查找标识符,这样每次上升一级作用域,最后抵达全局作用域,无论找到或没找到都将会停止。

不成功的 RHS 引用会导致抛出 ReferenceError 异常。不成功的 LHS 引用会导致自动隐式地创建一个全局变量(非严格模式下),该变量使用 LHS 引用的目标作为标识符,或者抛出 ReferenceError 异常(严格模式下)。

1.2 词法作用域

词法作用域意味着作用域是由书写代码时函数声明的位置决定的。编译的词法分析阶段基本能够知道全部标识符在那里以及是如何声明的,从而能够预测在执行过程中如何对他们进行查找。

JavaScript 中有两个机制可以“欺骗”词法作用域:

  • eval(...):可以对一段包含一个或多个声明的“代码”字符串进行演算,并借此来修改已经存在的词法作用域(在运行时)。
  • with:本质上是通过将一个对象的引用当做当前作用域来处理,将对象的属性当做作用域中的标识符来处理,从而创建一个新的词法作用域(同样是在运行时)。

上述两个机制的副作用是引擎无法在编译时对作用域查找进行优化,因为引擎只能谨慎地认为这样的优化是无效的。使用其中任意一个机制都将导致代码运行变得缓慢。不要使用他们!!!

1.3 函数作用域和块作用域

函数是 JavaScript 中最常见的作用域单元。本质上,声明一个函数内部的变量或函数,会在其所处的作用域中“隐藏”起来,这是有意为之的良好的设计原则。

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

从 ES3 开始,try/catch结构在 catch 分句中具有块作用域。

在 ES6 引入了 let 关键字,用来在任意代码块中声明变量;const 关键字声明常量。

1.4 提升

我们习惯将var a = 2;看作一个声明,而实际上 JavaScript 引擎并不这么认为。它将var a和a = 2当做两个单独的声明,第一个是编译阶段的任务,而第二个则是执行阶段的任务。(回顾下:编译-解析-执行)

因此无论作用域中的声明出现在什么地方,都将在代码本身被执行前首先进行处理。可以将这个过程形象地想象成所有的声明(变量和函数)都会被“移动”到各自作用域的最顶端,这个过程被称为提升。

声明本身会被提升,而包括函数表达式(var a = function(){...})的赋值在内的赋值操作并不会提升。

在写代码时我们要避免重复声明!

1.5 作用域闭包

当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这时就产生了闭包。

闭包可以用多种形式来实现模块等模式。

模板有两个主要特征:

  1. 为创建内部作用域而调用了一个包装函数;
  2. 包装函数的返回值必须至少包括一个队内部函数的引用,这样就会创建覆盖整个包装函数内部作用域的闭包。

附录A-动态作用域

动态作用域并不关心函数和作用域是如何声明以及在何处声明的,只关心他们从何处调用。换句话说,作用域链是基于调用栈的,而不是代码中的作用域嵌套。

词法作用域和动态作用域的区别:词法作用域是在写代码或者说定义时确定的,而动态作用域是在运行时确定的。(this 也是!)词法作用域关注函数在何处声明,而动态作用域关注函数从何处调用。

附录B-块作用域的替代方案

ES6之前是使用 catch 实现:

try{trow undefined}catch(a){
  a = 2;
  consloe.log(a); // 2
}

第二部分 this 和对象原型

2.1 关于 this

this是在运行时进行绑定的,并不是在编写时绑定的,它的上下文(context)取决于函数调用时的各种条件。this 的绑定和函数声明的位置没有任何关系,只取决于函数调用方式,它指向什么完全取决于函数在哪里被调用。

2.2 this 全面解析

如果要判断一个运行中函数的 this 绑定,就需要找到这个函数的直接调用位置。找到之后就可以顺序应用下面这四条规则来判断 this 的绑定对象。

  • 由new调用:绑定到新创建的对象。
  • 由call调用或者apply(或者bind)调用:绑定到指定的对象。(显式绑定)
  • 由上下文对象(作为对象的方法)调用:绑定到那个上下文对象。(隐式绑定)
  • 默认(作为独立函数调用):在严格模式下绑定到 undefined,否则绑定到全局对象 window。

ES6 的箭头函数是根据词法作用域来决定 this,具体来说,箭头函数会继承外层函数调用的 this 绑定(无论 this 绑定到什么)。这和 ES6 之前代码中的self = this机制一样。

2.3 对象

JavaScript 中的对象有字面量形式(var a = {...})和构造形式(var a = new Array(...))。字面形式更常用,不过有时候构造形式可以提供更多选项。

许多人都以为“JavaScript 中万物都是对象”,这是错误的。对象是 6 个(或者说 7 个,取决于你的观点)基础类型之一。对象有包括 function 在内的子类型,不同子类型具有不同的行为,比如内部标签[object Array]表示这是对象的子类型数据。

对象就是键/值对的集合。可以通过.propName或者["propName"]语法来获取属性值。访问属性时,引擎实际上会调用内部的默认[[Get]]操作(在设置属性时是[[Put]]),[[Get]]操作会检查对象本身是否包含这个属性吗,如果没有找到的话还会查找[[Prototype]]链。

属性的特性可以通过属性描述符来控制,比如 writable 和 configurable。此外,可以使用 object.preventExtensions(...)、Object.seal(...) 和 Object.freeze(...)来设置对象(及其属性)的不可变性级别。

属性不一定包含值——他们可能是具备 getter/setter 的“访问描述符”。此外属性可以是可枚举或者不可枚举的,这取决于他们是否会出现在 for..in循环中。

ES6 的for..of语法可以遍历数据结构(数组、对象)中的值。for..of 会寻找内置货值自定义的 @@intterator 对象并调用它的 next()方法来遍历数据值。

2.4 混合对象“类”

类是一种设计模式。类意味着复制。传统的类实例化时,它的行为会被复制到实例中。类被继承时,行为也会被复制到之类中。

多态(在继承链的不同层次名称相同但是功能不同的函数)看看起来似乎是从子类引用父类,但是本质上引用的是负复制的结果。

JavaScript 并不会(像类那样)自动创建对象的副本。

混入模式(无论显式还是隐式)可以用来模拟类的复制行为,但是通常会产生丑类并且脆弱的语法,比如显式伪多态(OtherObj.methodName.call(this,....)),这会让代码更加难懂并且难以维护。

此外,显式混入无法完全模拟类的复制行为,因为对象和函数只能复制引用,无法复制被引用的对象或者函数本身。

总结:在 JavaScript 中模拟类是得不偿失的!

2.5 原型

如果要访问对象中并不存在的一个属性,[[Get]]操作就会查找对象内部的[[prototype]]关联的对象。这个关联实际上定义了一条“原型链”(有点像嵌套的作用域链),在查找属性时,会对它进行遍历。

所有普通对象都有内置的Object.prototype,指向原型链的顶端(比如说全局作用域),如果在原型链中找不到指定的属性就会停止。toString()、valueOf和其他一些通用的功能都有存在于Object.prototype对象上,因此语言中所有的对象都可以使用他们。

关联的两个对象最常用的方法是使用new关键字进行函数调用,在调用的 4 个步骤(新建对象->修改__proto__->call 调用->返回对象)中会创一个关联其他对象的新对象。

使用 new 调用函数时会把新对象的 .prototype 属性关联到其他对象。带 new 的函数调用通常被称之为“构造函数调用”,尽管他们实际上和传统的面向类语言中的类构造函数不一样。

虽然这些 JavaScript 机制和传统面向类语言中的“类初始化”和“类继承”很相似,但是 JavaScript 中的机制有一个核心的区别,那就是不会进行复制,对象之间是通过[[Prototype]]链关联的。

处于各种原因,以“继承”结尾的术语(包括“原型继承”)和其他面向对象的术语都无法帮助我们理解 JavaScript 的真实机制。

相比之下,“委托”是一个更合适的术语,因为对象之间的关系不是复制而是委托。

2.6 行为委托

行为委托认为对象之间是兄弟关系,互相委托,而不是父类和字类得关系。Javascript 的 [[Prototype]] 机制本质上就是行为委托机制。也就是说,吗可以选择在 Javascript 中努力实现类机制(组合式继承),也可以拥抱更自然的 [[Prototype]]委托机制(Object.create())。

当只用对象来设计代码时,不仅可以让语法更加简洁,而且可以让代码结构更加清晰。

对象关联(对象之间互相关联)是一种编码风格,它倡导的是直接创建和关联对象,不把他们抽象成类。对象关联可以用基于 [[Prototype]] 的行为委托非常自然地实现。

timing window file中的S L T指什么意思 我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 阅读详情

相关推荐

Windows系统下复现PointNet++算法

本文详细介绍了如何在Windows系统下复现PointNet++算法,内容包括程序下载、环境配置、数据集准备以及三个主要任务(语义分割、分类、部件分割)的实现步骤和常见报错解决方法。通过遵循本文的指导,用户可以顺利完成PointNet++算法的复现。

LingYi_5的博客 4326

[书籍精读]《你不知道的JavaScript(下卷)》精读笔记分享

写在前面 书籍介绍:JavaScript这门语言简单易用,很容易上手,但其语言机制复杂微妙,即使是经验丰富的JavaScript开发人员,如果没有认真学习的话也无法真正理解。本套书直面当前JavaScript开发人员不求甚解的大趋势,深入理解语言内部的机制,全面介绍了JavaScript中常被人误解和忽视的重要知识点。 我的简评:《你不知道的JavaScript》系列分上中下三卷,这里是下卷,主要讲解ES6相关的。该系列书籍本人觉得就上卷写的不错,中卷有些冗余,下卷讲ES6比较粗糙。不过有空翻一翻,还是多

小磊哥er @ 资深研发工程师 1513

OpenCV+ArUco实战:如何用Python实现高精度二维码测距(附完整代码)

本文详细介绍了如何使用Python和OpenCV实现基于ArUco标签的高精度单目视觉测距。通过相机标定、标签检测和三维位置估算,结合完整代码示例,帮助开发者在机器人导航、工业自动化等场景中实现厘米级距离测量,并探讨了精度优化与三维可视化等进阶应用。

weixin_29052717的博客 478

《你不知道的javascript》阅读笔记(上卷第一部分)

一周的进度为了更好地了解javascript这门我比较喜欢的编程语言,我选择了《你不知道的javascript》这一本书来进行学习,先从上卷开始学习,一周下来把第一部分”作用域和闭包”以及第二部分“this和对象原型”的一到三章学习完毕,并做了一些笔记,一周将过,准备对学习的内容进行反思.javascript编译原理其实第一部分第一章居然先从编译原理开始讲起我是蛮惊讶的,了解了不少新概念:编译分为如

nzyalj的博客 439

CPU系统级验证——测试激励——imperas公司riscvOVPsimPlus文件分析

本分析重点关注该repo向量扩展部分。 1. repo简介 该repo是指令集验证的仿真环境包括,大部分是指令集的测试用例,也包含了一些模拟器,如riscvOVPsimPlus。 主要介绍的是riscvOVPsimPlus指令集模拟器,riscvOVPsimPlus(下面统称ISS)是imperas公司在riscvOVPsim基础上扩充了向量扩展的指令集模拟器,该repo于今年9月份部分开源 什么叫部分开源呢? 首先该repo必须在imperas官网注册下载,而且必须是企业用户(免费邮箱人家瞧不上.

知识,既贵,又便宜。 4460

Unity3D 集成 SQLite 数据库实战:从零搭建到数据可视化

本文详细介绍了在Unity3D项目中集成SQLite数据库的完整实战流程。从SQLite的轻量、稳定、易用特性讲起,逐步指导开发者完成环境配置、驱动集成、C#脚本编写(涵盖连接、建表、增删改查),并进阶演示了数据模型封装与在Unity UI中实现数据可视化的方法。最后提供了多线程访问、路径差异、性能优化等关键避坑指南,帮助开发者构建可靠高效的本地数据管理方案。

weixin_29291069的博客 92

读书笔记-你不知道的js(上卷)

作用域、闭包、对象、

junjiahuang的博客 276

PyQtWebEngine安装避坑指南:快速解决ModuleNotFoundError

本文详细解析了PyQt5开发中常见的ModuleNotFoundError: No module named 'PyQt5.QtWebEngineWidgets'错误。核心原因是PyQt5 5.11版本后,网页引擎组件被独立为PyQtWebEngine包。文章对比了退回旧版本、独立安装及使用Conda等多种解决方案,并提供了针对Windows、macOS和Linux不同平台的实战安装指南与验证方法,帮助开发者快速解决依赖问题。

weixin_29056101的博客 428

月读书系列-你不知道的javascript(上)

一、作用域和闭包 1.1、作用域是什么? 1.1.1、编译原理 作用域是一套规则,用来存储和访问变量。任何编程语言都不开作用域,正是作用域这种存储和访问变量的能力将状态带给了程序,赋予了编程语言可以实现丰富功能的能力。 讲到作用域就不得不提两个重要角色:引擎和编译器。引擎从头到尾负责整个javascript程序的编译和执行过程。编译器负责词法分析、语法分析、代码生成等脏活累活。 javascript 是一门编译型的语言,但它不是提前编译的,它的编译发生在在代码执行前的几微秒。 传统的编译语言的编译过程分为三

Ronychen的博客 466

游戏开发中的CV:实时动作捕捉与虚拟交互

游戏开发中的CV:实时动作捕捉与虚拟交互​ ,人工智能,计算机视觉,大模型,AI,在当今游戏产业中,玩家对游戏体验的要求日益提高,追求更加真实、沉浸的交互感受。计算机视觉(Computer Vision,CV)技术的飞速发展,为游戏开发带来了革命性的突破,其中实时动作捕捉与虚拟交互技术更是成为提升游戏品质的核心驱动力。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 16万+

Unreal5从入门到精通之初学者碰到解决不了的问题怎么办?

在学习Unreal的过程中,你曾陷入困境了吗?对于我来说,这种情况发生得比我愿意承认的要多得多。幸运的是,除了一般地在网上搜索之外,还有很多地方可以获得虚幻引擎的帮助。

TxNet 980

精读《你不知道的 javascript(上卷)》

你不知道的 javascript》是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途。本书介绍了该系列的两个主题:“作用域和闭包”以及“this和对象原型”。这两块也是值得我们反复去学习琢磨的两块只是内容,今天我们用思维导图的方式来精读一遍。(思维导图图片可能有点小,记得点开看,你会有所收获)

AzulSystems的博客 265

PC 端微信页面拆分及 JavaFx 使用

一、前言 对于一个知识点的学习过程来说,往往使用自己熟悉的工具或方式才更易于上手。因为所有同类型的知识点在抛出复杂的流程拨云见日后,所能得到的几乎都是同样的设计思想和实现理论。 在 Java 语言桌面版开发中,直至目前共提供了三套 UI 开发方式;Awt、Swing、JavaFx,以及一些扩展组件 SWT 等。在这三套 UI 组件中,JavaFx 是最新也是最为好用的,因为他提供了丰富的功能,以及...

bugstack虫洞栈 3615

《你不知道的JavaScript上卷》知识点整理与读书笔记

第一部分 作用域和闭包 第1章 作用域是什么 1.1编译原理 1.2理解作用域 1.3作用域嵌套 1.5异常 第2章 词法作用域 第3章 函数作用域和块作用域 第5章 作用域和闭包 第二部分 this和对象原型 第1章 关于this 第2章 this全面解析 第3章 对象 第4章 混合对象“类” 第5章 原型 第6章 行为委托 之前被好友推荐过《你不知道的JavaScript》这一系列的书籍。上中下三本书都不算厚,内容也是比较独立。本来是打算一个月内看完这本上卷和下卷,可总是因为自己的.

qq_45549336的博客 6405

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

《你不知道的JavaScript(上卷)》读书笔记

《你不知道的JavaScript》读书笔记

商华伟_骑白马的大师兄的博客 374

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

《你不知道的JavaScript上卷》知识点整理与读书笔记_百度你不知道的js书知识

/也就是这个对象本身,想一想为什么this是指向这个对象本身,我保证前面的this里面讲的知识,绝对可以分析出来这里的this指向哪里。foo.call(obj)//2 这里显示调用,foo中this是obj,所以回调中是obj的a。//这行代码只是为了验证()中的var i,以及{}中的a,最后在外部均可以访问到这两个标识符。foo()//3 这里光秃秃调用,foo中this是window,所以回调中是window的a。//当然把最后的()放进去的效果也是一样的,仅仅是书写风格不同。

m0_61067876的博客 1146

你不知道的JavaScript 上卷读书笔记

看了《你不知道的JavaScript 上》,为了防止自己忘记,特此记下与我而言的部分重点 任何足够先进的技术都和魔法无异。 ——Arthur C. Clarke 作用域和闭包 编译原理 分词/词法分析(Tokenizing/Lexing) 编程语言的所有字块与符号都会被分解为词法单元; var a = 2; //分解为var、a、=、2、;。 // ! 空格是否被当做词法单元,取决于空格在这门语言中是否具有意义 解析/语法分析(Parsing) 这个过程是将词法单元流转换成一个由元素逐.

weixin_42832836的博客 679

JS闭包—你不知道的JavaScript上卷读书笔记(二)

关于闭包,初学者会被绕的晕头转向,在学习的路上也付出了很多精力来理解。 让我们一起来揭开闭包神秘的面纱。 闭包晦涩的定义 看过很多关于闭包的定义,很多讲的云里雾里,晦涩难懂。让不少人以为闭包是多么玄乎的东西。在我看过的所有书籍中,我更喜欢《你不知道的javascript(上卷)》的定义: 当函数可以记住并访问所在的词法作用域时,就产生了闭包,或者说函数在创建时的词法作域之外执行。 通俗的来说(不严...

weixin_30240349的博客 107

你不知道的JavaScript(上卷)读书笔记

《你不知道的JavaScript(上卷)》读书笔记。

多啦的博客 865

《你不知道的javascript(上卷)》——读书笔记

《你不知道的javascript(上卷)》 摘要:         我觉得这本数对javascript的一些难点有深层次的分析,遂打算近日拿来学习.          本书目录:                 第一部分: 作用域和闭包                第二部分: this和对象原型 第一部分: 作用域 概念:引

weixin_40821790的博客 1044

你不知道的JavaScript(上卷)——读书笔记

1. 作用域 1.1 角色 引擎 从头到尾负责整个JavaScript程序的编译及执行过程。 编译器 引擎的好朋友之一,负责语法分析及代码生成等脏活累活。 作用域 作用域引擎的另一位好朋友,负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。 1.2 编译过程 RHS查询 (赋值操作的左侧) 简单地找到某个变量 LHS查询(赋值操作的右侧) 试图找到变量地容器本身,从而可以对其赋值 1.3 作用域嵌套 当

Floyd的博客 292

你不知道的JavaScript(上卷)(读书笔记之一)

学习笔记之一(你不知道的JavaScript(上卷)) 第二部分 this 和对象原型 任何足够先进的技术都与魔法无异。 —Arthur.C Clarke this到底是什么 如何判断this 可以从以下方面进行判断 被忽略的this 更安全的this 赋值表达式 p.foo = o.foo的返回值是目标函数的引用 ...

wenbintian的博客 355

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

第一章 作用域是什么

Pentium的博客 337

你不知道的javascript(上卷)——读书笔记

javascript很重要,一定要学好,把基础的知识点掌握了,才能学的更透彻!学习要有求知欲。知其然,知其所以然! 这里的笔记主要是用于平常的知识回顾~ 第一章 作用域是什么? 1.在传统编译语言的流程中,程序中的一段源码在执行之前会经历三个步骤,统称为“编译”。这三个阶段分别为: 词法分析(分词) 语法分析(解析) 代码生成 2.变量的赋值操作会执行两个动作,首先,编译器会在当前作用...

归零 649

读书笔记(你不知道的javascript上卷)(上)

本篇作为自己已经看了一半的你不知道的javascript上卷的一些小节,重新认识js,希望我的一些理解能够给大家重新认识js。前半部分的内容主要有以下几点 作用域和闭包 作用域 词法作用域 函数作用域和块作用域 作用域闭包 首先对于一段js源代码,js引擎执行分为了三个步骤 词法分析 语法分析 代码生成 虽然引擎编译的步骤只有三步,但是千万不要以为js编译非常简单,实际实现的过程是非常复...

Ningqiugu的博客 490

《你不知道的JavaScript》上卷,读书笔记01

最近在看《你不知道的JavaScript》,Mark一下。 一. LHS(Left-Hand-Side)查询和RHS(Right-Hand-Side)查询 问题1:之前只知道在JavaScript中,如果一个变量a未经声明就直接取值,如 console.log(a),会抛出ReferenceError异常;如果一个变量a未经声明,就直接赋值,如 a = 2,那么程序会自动创建一个全局变量a,然...

sunny的博客 470
上一篇: 【Element】升级到2.15.7升级时报错 $--group-option-flex: 0 0 math.div(1, 5) * 100% !default;...
下一篇: 【Element】el-option value 绑定对象类型(item)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值