首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JavaScript 作用域不完全指北

理解作用域 在刚开始接触 JavaScript 这门语言时,肯定会经常接触到 JavaScript 是动态语言, 是解释执行事实上 JavaScript 是一门编译语言。...2.接下来编译器会为引擎生成运行时所需代码, 这些代码被用来处理 a = 2 这个赋值操作。 引擎运行时会首先询问作用域, 在当前作用域集合中是否存在一个叫作 a 变量。...简单来说,变量赋值操作会执行两个动作, 首先编译器会在当前作用域中声明一个变量(如果之前没有声明过), 然后在运行时引擎会在作用域中查找该变量, 如果能够找到就会对它赋值,否则就会并抛出一个异常。...1.当引擎执行 RHS 查询时,如果 RHS 查询在所有嵌套作用域中遍寻不到所需变量, 引擎就会抛出 ReferenceError异常。...console.log(a); //ReferenceError: a is not defined 2 2.当引擎执行 LHS 查询时, 如果在顶层(全局作用域) 中也无法找到目标变量,全局作用域中就会创建一个具有该名称变量

37030

JS进阶:作用域和作用域链

作用域(Scope) 1.什么是作用域 作用域是在运行时代码中某些特定部分中变量,函数和对象可访问性。换句话说,作用域决定了代码区块中变量和其他资源可见性。...再一层一层向上寻找,直到找到全局作用域还是没找到,就宣布放弃。这种一层一层关系,就是 作用域链 。...,事实并非如此。...执行上下文最明显就是this指向是执行时确定。而作用域访问变量是编写代码结构确定。...作用域和执行上下文之间最大区别是:执行上下文在运行时确定,随时可能改变;作用域在定义时就确定,并且不会改变。 一个作用域下可能包含若干个上下文环境。

2.6K20
您找到你想要的搜索结果了吗?
是的
没有找到

JavaScript 开发中常见错误解决小总结

,这个例子中缺少结尾大括号 },在编写代码时尽可能维持正确锁紧,将代码排列整齐之后更容易找到错误。...语法解析错误:未预期符号 },代码结尾多了一个 } 符号导致环境运行错误,这个错误排查方法与上面相同,尽可能将代码排整齐并维持首尾符号一致。...Uncaught ReferenceError: $ is not defined 错误类型:TypeError TypeError 是类型上错误,同样 IDE 也不会预先提示有错误,必须在执行时才会看到...,这类型错误通常是以下几种: 试图获取 undefined、null 属性 尝试调用非函式变量或表达式(例如: 'text'()) ❝排查重点:在获取变量前先确认其当前数据类型及结构 ❞ Uncaught...这类错误也很常见,却不容易找到出错原因,其主要原因是在递归时超过了环境限制(使用框架时也很常见),如果遇到这错误建议改写当前调用函数方式。

3K20

《你不知道JavaScript》-- 作用域(笔记)

变量赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对它赋值,否则抛出异常。...词法作用域是在写代码或者说定义时确定,而动态作用域是在运行时确定(this也是),词法作用域关注函数在何处声明,而动态作用域关注函数从何处调用。...和 with 1)eval(..)可以对一段包含一个或多个声明代码字符串进行演算,并借此在运行时来修改已经存在词法作用域; 2)with本质上是通过将一个对象引用当作作用域来处理,将对象属性当作作用域中标识符来处理...,从而在运行时创建一个新词法作用域; 3)这两个机制副作用是引擎无法在编译时对作用域查找进行优化,因为引擎只能谨慎地认为这样优化是无效; 4)使用这其中任何一个机制都将导致代码运行变慢,建议不要使用...ES6还引入了const,同样可以用来创建块作用域变量,其值是固定(常量),之后任何试图修改值操作都会引起错误。

66320

43道JavaScript面试题

,setTimeout函数真正被执行时,循环已经走完。...由于第一个循环中变量i是使用var关键字声明,因此该值是全局。 在循环期间,我们每次使用一运算符++都会将i值增加1。...mouse没有名为bird键,这意味着mouse.bird是undefined。 然后,我们使用点符号来询问size:mouse.bird.size。...这就是您可以使用内置JavaScript方法原因! 所有这些方法都可以在原型上找到。 虽然JavaScript无法直接在您对象上找到它,但它会沿着原型链向下寻找并在那里找到它,这使您可以访问它。...答案: B 关闭选项卡后,将删除存储在sessionStorage中数据。 如果使用localStorage,数据将永远存在,除非例如调用localStorage.clear()。

1.8K20

JavaScript 面试要点:作用域和闭包

: 编译器在当前作用域中声明一个变量(如果之前没有声明过) 在运行时,引擎会在作用域中查找该变量,如果能够找到就会对它赋值 # 作用域嵌套 function foo (a) { console.log...作用域气泡结构和互相之间位置关系给引擎提供了足够位置信息,引擎用这些信息来查找标识符位置。 作用域查找会在找到第一个匹配标识符时停止。...抛开遮蔽效应,作用域查找始终从运行时所处最内部作用域开始,逐级向外或者说向上进行,直到遇见第一个匹配标识符为止。...反过来想也可以带来一些启示:从所写代码中挑选出一个任意片段,然后用函数声明对它进行包装,实际上就是把这些代码 “隐藏” 起来了。 有很多原因促成了这种基于作用域隐藏方法。...i 最终值 我们试图假设 循环中每个迭代在运行时都会给自己“捕获”一个 i 副本。

42120

10秒钟内说出js中有哪些内置错误类型

/ 处理越界错误 } } 内置错误类型3:TypeError 常见指数:⭐⭐⭐⭐ 使用ts之前可能会有,ts之后应该能干掉一大部分 TypeError在JavaScript中很常见,主要发生变量在运行时访问不是预期类型...JS 引擎在解析期间会捕获了这个错误,而不是运行时。 ? 或者给eval()传入字符串包含JavaScript语法错误时,也会抛出此异常 ?...内置错误类型5:URIError 常见指数:⭐ 很少见 URIError只会在使用encodeURL()或decodeURL()时,传入了格式错误URL时发生,非常罕见,因为上面两个函数非常稳健....EvalError 不在当前ECMAScript规范中使用,因此不会被运行时抛出. 但是对象本身仍然与规范早期版本向后兼容. 以下来自mdn ?...例如,递归过多导致了栈溢出.这类型并不是代码中通常要处理错误,如果真的发生了这种错误,很可能代码哪里搞错了或者有危险. 事实证明递归过多导致栈溢出报是RangeError。 ?

1.1K10

带你了解 JavaScript 作用域

例如V8引擎,为了提高JavaScript代码运行性能,在运行之前会先将其编译为本地机器码,然后再去执行机器码,达到提升速度目的。...4.引擎运行时会首先查询当前作用域是否存在叫做 foo 变量。如果有引擎则会使用这个变量,否则会一直向上层作用域查找。...总结:变量赋值会执行两个动作:首先是编译器在当前作用域中声明变量(如果变量未被声明过);接着运行时引擎在作用域查找该变量,能找到就会对它赋值。...ReferenceError 上一节提到了LHS,RHS都会在作用域内逐层查找变量,如果到达全局作用域仍然没有找到变量怎么办呢? 这时区分LHS和RHS查询意义就体现出来了。...如果RHS查询在所有嵌套作用域中都没有找到所需变量,引擎就会抛出 ReferenceError

27930

ES6中let、const和var区别

let 用法类似于 var,所声明变量只在 let 命令所在代码块内有效(一个“{}”相当于一个代码块) { let a = 123; var b = 123; } a // ReferenceError...所以在代码块内,使用 let 命令声明变量之前,该变量都是不可用。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。...,而是变量指向那个内存地址所保存数据不能改动。...对于简单类型数据(数值、字符串、布尔值),值就保存在变量指向那个内存地址,因此等同于常量。...但对于复合类型数据(主要是对象和数组),变量指向内存地址,保存只是一个指向实际数据指针,const 只能保证这个指针是固定,至于它指向数据结构是不是可变,就完全不能控制了。

67910

他们渲染了一百万个网页,来了解网络如何崩溃

即: 引用错误(ReferenceError)、类型错误(TypeError)、语法错误(SyntaxError) 占所有错误 85%!...jQuery 未定义(常见) 意外符号 '<'(常见) 无效或意外符号 无法读取 undefined envelope 属性(常见) $ 符不是一个函数(常见) 无法读取 null addRventListener...数据显示:大多数错误来自于运行时缺少代码、数据、或文档对象。很有可能是由于 Web 绑定特性决定:类型在运行时(后期)才被确定,而不是在编译时(早期)就被确定。...的确,在运行时才确定类型可以使得加载各类库更轻松自然,但它也造成了一些错误发生可能:即可能出现缺少库或者 API 发生了改变情况。...从历史中学习,我们似乎有必要围绕动态找到一个更好解决方案,并考虑运行时绑定! 静态类型语言能为我们提供安全性,动态类型语言又是 Web 不易出错关键。二者平衡是最终关键!

1.3K20

JavaScript作用域深度剖析:从局部到全局一网打尽

• S: 变量赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该便令,如果能够找到就会对它进行赋值。.... + b) 进行 RHS 查询时未找到该变量,也就是说,这是一个"未声明" 变量,因为在任何相关作用域都无法找到它,直接抛出 'ReferenceError'。...当引擎执行 RHS 查询在所有嵌套作用域中找不到所需变量,引擎就会抛出 ReferenceError 异常。 2....如果 RHS 找到了一个变量,尝试对这个变量进行一些不合理操作时,比如对一个非函数类型值进行函数调用,或者引用 null 或 undefined 类型之中属性,那引擎则会抛出另外一种类型异常...如果 RHS 找到了一个变量,尝试对这个变量进行一些不合理操作时,比如对一个非函数类型值进行函数调用,或者引用 null 或 undefined 类型之中属性,那引擎则会抛出另外一种类型异常

6910

python异常报错详解

访问未初始化本地变量 ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了对象 RuntimeError 一般行时错误 NotImplementedError...当EnvironmentError使用3组实例化异常时,前两个项目如上所述,而第三个项目在该filename属性上可用。但是,为了向后兼容,该 args属性仅包含前两个构造函数参数2组。...这个异常总是定义,但是只有当Python配置了该--with-fpectl选项,或者WANT_SIGFPE_HANDLER在pyconfig.h文件中定义了符号时,才能引发此异常 。...object 编解码器正在尝试编码或解码对象。 start 第一个无效数据索引object。 end 上次无效数据索引object。...python提供了两个非常重要功能来处理python程序在运行中出现异常和错误,异常处理和断言(Assertions)。

4.6K20

JavaScript中LHS和RHS分析

当对一个变量执行RHS查询时,如果遍历该变量所在处词法作用域未能找到这个变量,JS引擎就会抛出ReferenceError错误如果成功查询到了这个变量,但是对这个变量执行不合理操作,比如对一个非数组变量执行下标取值...而在ES5严格模式下,LHS查询失败时JS引擎会抛出一个同RHS一样ReferenceError错误。...在JS语言特点 JavaScript在类型上通常会被归类为“动态”或“解释执行”语言,事实上它是一门编译语言。...分析 变量赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对它赋值。...,最后抵达全局作用域,最后无论找到或没找到都将到此为止 总结 不成功RHS引用会导致抛出ReferenceError异常。

1K00

送你43道JavaScript面试题

,setTimeout函数真正被执行时,循环已经走完。...由于第一个循环中变量i是使用var关键字声明,因此该值是全局。 在循环期间,我们每次使用一运算符++都会将i值增加1。...mouse没有名为bird键,这意味着mouse.bird是undefined。 然后,我们使用点符号来询问size:mouse.bird.size。...这就是您可以使用内置JavaScript方法原因! 所有这些方法都可以在原型上找到。 虽然JavaScript无法直接在您对象上找到它,但它会沿着原型链向下寻找并在那里找到它,这使您可以访问它。...答案: B 关闭选项卡后,将删除存储在sessionStorage中数据。 如果使用localStorage,数据将永远存在,除非例如调用localStorage.clear()。

1.6K30

送你43道JavaScript面试题

,setTimeout函数真正被执行时,循环已经走完。...由于第一个循环中变量i是使用var关键字声明,因此该值是全局。 在循环期间,我们每次使用一运算符++都会将i值增加1。...mouse没有名为bird键,这意味着mouse.bird是undefined。 然后,我们使用点符号来询问size:mouse.bird.size。...这就是您可以使用内置JavaScript方法原因! 所有这些方法都可以在原型上找到。 虽然JavaScript无法直接在您对象上找到它,但它会沿着原型链向下寻找并在那里找到它,这使您可以访问它。...答案: B 关闭选项卡后,将删除存储在sessionStorage中数据。 如果使用localStorage,数据将永远存在,除非例如调用localStorage.clear()。

1.5K20

Kubernetes 集群需要重点关注 6 个指标

阅读这篇文章可能是一个很好起点 我们将介绍基于 k8s 数据最关键指标,这些数据构成了监控工作负载并确保它们处于健康状态良好基准。...需要 6 个 CPU 内核 pod 不会被调度到此节点,因为没有足够可用 CPU 内核来托管它。 “实际使用情况”指标跟踪 pod 在运行时使用了多少资源。...有时,由于多种原因,某些 pod 可能不可用,例如: 由于资源请求,某些 pod 可能不适合集群中任何正在运节点——这些 pod 将转换为 Pending 状态,直到节点释放资源来托管它们或满足要求新节点加入集群...Ready 和 NetworkUnavailable 条件有点棘手,需要进一步调查才能找到问题根源。 如何解决呢?我首先期望正好有 0 个节点不健康,这样当每个节点变得不健康时都会触发告警。...除了使您免于未来故障之外,观察此指标还可用于规划随时间记录和添加数据工作负载。Prometheus 是此类工作负载一个很好例子——当它将数据点写入其时间序列数据库时,磁盘中可用空间量会减少。

1.2K20

Java魔法堂:类加载机制入了个门

将字节流所代表静态存储结构(Class文件结构)转化为方法区行时数据结构。   3....验证(Verification)    验证文件格式验证、 数据验证、 字节码验证 和 符号引用验证 4个操作。    1....数据验证        操作对象:方法区中类或接口信息   目的:对字节码描述数据信息进行语义分析,保证符合Java语言规范。   类数据信息包括:      a....StackMapTable数据依然可以被篡改,而这就是JVM开发团队需要考虑了。       注意:字节码验证时会触发父类或所实现接口符号引用解析(也就是会触发类加载过程)。    4....通过符号引用中字符串描述全限定名是否可以在方法区中找到对应类。     b. 通过符号引用中对字段、方法简单名和描述符是否可以在方法区找到对应字段和方法。     c.

91470
领券