读书笔记《你不知道的JavaScript上卷》1.2词法作用域

AD2S1210与DSP28335 SPI通信中的GPIO配置陷阱与解决 本文深入剖析了AD2S1210与DSP28335进行SPI通信时,因GPIO输入限定配置不当导致数据整体右移的典型问题。文章指出,错误地将MISO引脚配置为带采样周期的同步模式是根本原因,并提供了将输入选择限制正确设置为异步模式的解决方案。同时,总结了不同应用场景下GPIO输入限定的配置原则,为高速同步通信的稳定实现提供了关键指导。 阅读详情

词法作用域

今天的读书笔记是JavaScript中的词法作用域,希望对大家有所帮助。


2.1 定义

词法作用域: 词法作用域就是定义在词法阶段的作用域,它由写代码时将变量和块作用域写在哪里来决定的。

坦白说这个定义第一句话是废话!重点是后一句话,它说作用域是由变量和块作用域写在哪里来决定的,也就是说它的作用域不是由(通常为函数)调用的地方来决定,而是由作用域声明的地方来决定,即“无论函数在哪里被调用,也无论它如何被调用,它的词法作用域都只是由函数被声明时所处的位置决定”,这里给出下面的例子:

function foo(){
    console.log(a);//打印1
} 
function bar(){
    var a = 2;
    foo();
}
var a = 1;
bar();

上述代码很简单,函数bar中定义了一个变量a其值为2并且调用了另一个函数foo,函数foo做的事情就是把a打印了一下。那么最后打印的a的值是多少呢?上述代码已给出了结果,是1。当函数bar调用函数foo的时候,会打印a,结果foo这个函数的作用域中并没有a这个变量,那么根据作用域冒泡原则它会在上一作用域中查找,上面词法作用域定义中说到”词法作用域由作用域定义的地方来决定”,foo定义在全局作用域中,也就是它冒泡会冒到全局作用域中,全局作用域中有a这么个变量,并且值是1,所以它打印1。从本例中可以看出JavaScript中的作用域并不是基于代码中作用域的嵌套。

2.2 浏览器中调用某个全局变量

如果在某个作用域中想要调用全局的某个变量那么该怎么办呢?浏览器中给出了一个window对象,所有的全局变量都是属于该对象的属性。

var a = 3;
console.log(a);//打印3
console.log(window.a);//打印3

2.3 词法欺骗

JavaScript中作用域由其声明的位置来决定,那么有没有不符合这种情况的时候呢?答案是有的,主要有两种情况:一个是eval函数,另一个是with语句。

2.3.1 eval函数

eval函数可以传递一个字符串的参数,然后调用该函数时会把函数的参数当做代码来执行:

eval("alert(123);");//浏览器会弹出123的对话框

现在考虑如下代码:

function foo(str,a){
    eval(str);
    console.log(a,b);//打印1,3
}
var b = 2;
foo("var b = 3;",1);

上述代码中按照正常的词法作用域的情况,foo函数中并没有声明变量b它会去上一作用域中查找也就是全局作用域,里面有变量b值为2,但是由于eval相当于动态插入了一行代码“var b = 3;”它把b的值变为了3,所以打印了3,这跟正常情况不符。

在严格模式下eval有自己的作用域,它无法修改该函数所在作用域的值:

"use strict"//严格模式
eval("var a = 1;");
console.log(a);//Uncaught ReferenceError: a is not defined

最后八卦一下这个eval函数,它还有一个用途就是解析json报文,将字符串的json报文转换为json对象,现在应该知道它为什么会是这样了吧,因为它会把该字符串的json按照JavaScript代码来处理,而代码中它就是一个json对象。

var a = eval("("+"{name:'javascript'}" + ")");
console.log(a.name);

不过上述代码为什么要加括号呢?如果不加的话JavaScript会把里面的花括号当做语句中的花括号而不能解析json。不过最好不要用这种方法解析,好一点的做法是用JSON对象或JQuery提供的方法。

2.3.2 with语句

with语句通常被当做重复引用同一个对象中的多个属性的快捷方式,可以不需要重复定义引用的对象,具体如下:

var obj = {
    a:1,
    b:2
};
//重复调用obj的赋值
obj.a = 2;
obj.b = 3;
//使用with语句的赋值
with(obj){
    a = 3;
    b = 4;
}

with语句同样会产生词法欺骗现象:

function foo(obj){
    with(obj){
        a = 2;
    }
}
var o1 = {
    a:3
};
var o2 = {
    b:3
};
foo(o1);
console.log(o1.a);//打印2

foo(o2);//注意这里的o2并没有a这么个属性
console.log(o2.a);//打印undefined
console.log(a);//打印2        

上述结果很让人费解,为什么是这样呢?其实with实际上是根据你传递给它的对象凭空创建一个新的作用域。对于上述o2对象来说,它没有a这个属性,也就是这个新的作用域中没有这个变量,那么将会向上一作用域中查找该变量,如果找到了那么就使用改变量的值,如果没有找到的话那么继续向上找。上述代码中很显然直到全局作用域都没有找到,那么它就在最外层的作用域创建了一个变量a并赋值为2,于是就有了这种不安全的现象。

由于with的不安全性,在严格模式下with被禁用了。

2.3 性能

像eval和with这样的词法欺骗会使得性能下降,而且使用起来也是相当不安全的,所以我建议大家最好不要使用它们!

C#上位机性能优化全攻略:彻底解决界面卡顿+多线程死锁+PLC数据延迟,产线实测稳定运行2年 一开始我们用的是网上找的零散优化代码,根本满足不了要求,后来花了2个月的时间,把之前27条产线的代码整理、重构、优化,做了一套这套方案上线后,连续稳定运行2年零3个月:界面响应时间稳定在50ms以内,多线程死锁率持续为0,PLC数据延迟稳定在150ms以内,系统可用率≥99.99%,帮客户一年省下了超过480万的停线损失、罚款损失和人工成本,客户第二年就把剩下的22条产线也全部交给我们做了,还介绍了3家同行。 阅读详情

相关推荐

安卓模拟器绕过检测全解析:雷电、MuMu、蓝叠、逍遥、夜神与WSA完整指南

随着手机游戏和应用的普及,越来越多的用户选择在PC上通过模拟器来运行安卓应用。然而,许多应用和游戏为了防止作弊或出于安全考虑,会检测是否运行在模拟器环境中。本文将详细介绍各大主流模拟器的检测绕过方法,帮助用户在电脑上流畅体验各类安卓应用。1. 获取模拟器系统镜像2. 使用ROM厨房工具修改系统文件3. 替换模拟器的系统镜像雷电模拟器:适合游戏,推荐使用MAGISK + EdXposed方案MuMu模拟器:适合中度游戏,推荐太极框架蓝叠模拟器:适合国际应用,推荐MAGISK方案逍遥模拟器。

专注技术分享 3万+

《你不知道的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

机械臂速成小指南(七):从旋转矩阵到齐次变换——机械臂位姿的数学表达

本文详细介绍了机械臂位姿描述的数学基础,包括旋转矩阵、欧拉角和齐次变换等核心概念。通过解析旋转矩阵的几何意义和合成方法,以及欧拉角的直观描述,帮助读者理解机械臂位姿的数学表达。文章还探讨了齐次变换在工程实践中的应用,并提供了数值稳定性、坐标系约定和计算效率等实用建议。

cuda7parallel的博客 835

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

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

weixin_42832836的博客 679

网格聚类 Grid Clustering/Grid-based Clustering

本文主要简单介绍了网格聚类的基本概念,优缺点,应用场景,建模时的注意事项,评价指标,实现方法,python示例和模型参数等。

JasonH2021的博客 4828

从0到1:提示工程架构师搭建Agentic AI系统的全流程实战手册

Agentic AI(自主智能体)是具备自主决策能力的大模型应用感知(Perceive):获取外部环境信息(比如代码仓库、用户输入、数据库数据);记忆(Memory):存储和检索历史信息(比如过去的审计记录、用户偏好);规划(Plan):将复杂任务拆解为可执行的步骤(比如“代码审计”拆成3步);行动(Act):调用工具或API完成具体操作(比如调用Git克隆仓库、调用Safety查漏洞);反馈(Feedback):根据结果调整策略(比如用户说“报告不够详细”,下次增加逻辑漏洞的分析深度)。

AI Agent Harness Engineering 1042

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

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

多啦的博客 865

你不知道的JS(上卷)——读书笔记2 词法作用域

第二章 词法作用域 JS语言是词法作用域(除此之外有的语言是动态作用域),其意思是作用域由你写的代码(变量、块作用域)所在的位置来决定的,在词法分析器处理代码时会保持作用域不变(有些例外情况) 由于作用域嵌套的规则,使得找到指定的标识符(变量)需要从当前的作用域开始找,逐级向上进行查找,当查找到变量后便停止查找 遮蔽效应:根据刚才规则,只要在里层作用域创建相同名字标识符,就可以使外层作用域的变量不会被访问到。但是由于声明的全局变量会自动成为全局对象(比如window对象)的属性,所以可以直接通过全局对象的属

weixin_44710964的博客 193

核磁共振常用的文件格式介绍:NIfTI volume 格式 (*.nii), GIFTI 格式 (*.gii), CIFTI 格式 (*.nii)

NIfTI volume 格式 (*.nii)GIFTI 格式 (*.gii)CIFTI 格式 (*.nii)Scene file文件 (*.scene)规格文件 (*.spec)解剖 (*.annot)一个场景文件包含一个或多个场景;每个场景实际上是保存时 wb_view 内部状态的快照。这包括有关加载哪些文件、如何显示、如何配置选项卡的信息(选择了哪些表面、在每个层中选择了哪些文件、打开了哪些层、哪些视图旋转、调色板设置、平铺选项卡等),以及在它们上面添加了哪些注释(文本、箭头、圆圈等)。

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 3045

第十六章:载板制造工艺大全

本文详细介绍了IC载板制造的完整工艺流程,主要包括开料、钻孔、孔金属化、图形形成、层压、表面处理、成型和电测8大工序。每个工序都列出了关键参数和质量控制要点,如开料尺寸精度±0.1mm、激光钻孔孔径50-150μm、孔金属化铜厚20-30μm、图形形成线宽15μm±2μm等。文中还特别说明了MSAP工艺和沉金等特殊工艺的详细流程,以及成型精度和电测标准等关键指标。全文通过流程图和参数表格直观展示了IC载板制造的核心工艺和质量要求。

Open 185

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

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

weixin_40821790的博客 1044

【MicroPython编程-ESP32篇:设备驱动】-SHT31温度湿度传感器驱动

SHT31 是 Sensirion 的下一代温湿度传感器。 它建立在一个新的 CMOSens® 传感器芯片之上,该芯片是 Sensirion 新湿度和温度平台的核心。

视觉与物联智能 231

《你不知道的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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅; 上中下三本的读书笔记: 《你不知道的JavaScript》 (上) 读书笔记 《你不知道的JavaScript》 (中) 读书笔记 《你不知道的JavaScript》 (下) 读书笔记 第一部分 作用域和闭包 第二章 词法作用域 词法查找 全局变量会自动成为全局对象(浏...

大灰狼的小绵羊哥哥的博客 694

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

Floyd的博客 292

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

???? 上卷: 作用域和闭包, this和对象原型 ???? 中卷: 类型和语法, 异步和性能 ???? 下卷:起步上路,es6及更新版本 目录 Part 1 作用域和闭包 chart 1 作用域是什么 1.1 编译原理 1.2 理解作用域 1.3 作用域嵌套 1.4 异常 1.5 ????小结 chart 2 词法作用域 2.1 词法阶段 2.2 欺骗词法 2.3 ????小结 Part 1 作用域和闭包 chart 1 作用域是什么 1.1 编译原理 javas

一只胖胖胖miao 974

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

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

归零 649

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

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

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

你不知道的Javascript(上卷)读书笔记之二 ---- 词法作用域

在前一篇文章中,我们把作用域定义为”管理、维护变量的一套规则”,接下来是时候来深入讨论一下Js的作用域问题了,首先我们要知道作用域一般有两种主要的工作类型,一种是词法作用域,一种是动态作用域, Javascript采用的是词法作用域, 关于动态作用域的有兴趣的可以自行Google。 1.词法阶段 首先我们要理解”词法阶段”这个词语,我们已经了解到Js存在一个编译阶...

deng2131的博客 166

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

第一部分 作用域和闭包 1.1 作用域是什么? 作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是对变量进行赋值,那么就会使用 LHS 查询;如果目的是获取变量的值,就会使用 RHS 查询。赋值操作符会导致 LHS 查询。=操作符或调用函数时传入参数的操作都会导致关联作用域的赋值操作。 JavaScript 引擎首先会在代码执行前对其进行编译(词法分析->语法分析...

日常问题bug解决、学习分享、个人杂谈等等随便写写哈哈哈 167

你不知道的JavaScript上卷 - 读书笔记 - 第2章词法作用域-2.2 欺骗词法

JavaScript 在ES6以前只有函数作用域。 ES6开始支持块作用域: {} 包裹的范围 作用域中查找变量or函数的规则是从当前向上(父集)逐级查找,找到最近的就拿来用。 如果找到顶级(全局作用域:比如浏览器的window对象)还没有,就默认创建一个。 词法作用域的规则决定,所有变量or函数在写代码时就已经确定了他所在的作用域。但是也有动态修改词法作用域的情况比如eval和with。 这两东西都不推荐使用了。但是作为学习理解还是有点用的。 eval和with的缺点 最直接的就是,有他们的存在使代.

灵台方寸山斜月三星洞 332

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

作用域、闭包、对象、

junjiahuang的博客 276

《你不知道的JavaScript》 (上) 阅读摘要

本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅

前端下午茶 235

【读书笔记】《你不知道的JavaScript(上卷)》——第一部分 作用域与闭包

文章目录第1章 作用域是什么1.1 编译原理1.2 理解作用域1.3 作用域嵌套1.4 异常第2章 词法作用域 github:https://github.com/getify/You-Dont-Know-JS/tree/1ed-zh-CN gitee:https://gitee.com/OliverDaDa/You-Dont-Know-JS —— forked from github 第1章 作用域是什么 1.1 编译原理 相对来说JavaScript并不能像其他编译语言一样,可以将编译结果直接作

程序边界 786

你不知道的JS(上卷)——读书笔记5 作用域闭包

第五章 闭包在JS中无处不在,我们需要的是能够识别、理解并能灵活运用它 function foo(){ var a = 2; function bar(){ console.log(a); //2 } bar(); } 在上述代码中,是一个属于闭包的简单例子,但是并不能最好的代表闭包所表现出来的作用,借用书中的一句话: 这是闭包吗?技术上来讲,也许是。但根据前面的定义,确切地说并不是。我认为最准确地用来解释bar()对a的引用的方法是词法作用域的查找规则,而这些规则只是闭包的一部分。(但却

weixin_44710964的博客 213
上一篇: 读书笔记《你不知道的JavaScript上卷》1.1作用域是什么
下一篇: HTML自定义滚动条(仿网易邮箱滚动条)
javao_0
博客等级 码龄12年 6粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值