首页
学习
活动
专区
圈层
工具
发布

JavaScript中的变量查找

众所周知,JavaScript变量是按照作用域链来进行查找的(作用域和作用域链相关知识可参看我的另一篇文章,《基于JavaScript作用域链的性能调优》), 那么,对于一个简单的赋值操作,等号左右两边变量的查找方式一样吗...LHS和RHS查询区别 (1) LHS查询 当JavaScript引擎执行LHS查询时,如果在顶层作用域中无法找到目标变量,那么,就会在全局作用域中创建一个具有该名称的变量,并将其返回给引擎(非严格模式下...参考文章首部的例子: b = 4; console.log(b); // 4 delete b; console.log(window.b); // undefined 程序中并没有声明变量b,但是由于...(2) RHS查询 当JavaScript引擎执行RHS查询时,如果在作用域链中都无法找到目标变量,那么,引擎会抛出ReferenceError异常。...小贴士 (1) 变量提升 概念:用var声明的变量,总是会被JavaScript解释器悄悄地“提升”到方法体的最顶部。

2.5K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JavaScript的变量

    JavaScript的变量 变量相当于容器,值相当于容器内装的东西,而变量名就是容器上贴着的标签,通过标签可以找到 变量,以便读、写它存储的值。...声明变量 在 JavaScript 中,声明变量使用 var 语句。 示例1 在一个 var 语句中,可以声明一个或多个变量,也可以为变量赋值,未赋值的变量初始化为 undefined(未定义)值。...(b); //返回 1 示例2 在 JavaScript 中,可以重复声明同一个变量,也可以反复初始化变量的值。...示例 变量提升。JavaScript 在预编译期会先预处理声明的变量,但是变量的赋值操作发生在 JavaScript 执行期,而不是预编译期。...变量作用域 变量作用域(Scope)是指变量在程序中可以访问的有效范围,也称为变量的可见性。

    71210

    前端JavaScript中的动态事件添加

    前言 在前端开发中,交互性是至关重要的。动态事件添加是一种在JavaScript中实现交互的重要技术。本文将介绍动态事件添加的概念和优势,并详细介绍两种常用的动态事件添加方法。...事件的基本概念 事件是指在网页中发生的特定交互行为,比如点击按钮、滚动页面或输入文本等。通过事件,我们可以在特定的交互行为发生时触发相关的JavaScript代码,以实现相应的操作和逻辑。...减少重复代码: 可以通过动态事件添加的方式,避免在HTML中为每个元素都编写相同的事件处理代码。...3.事件处理函数中编写具体的操作逻辑。 通过事件委托实现动态事件绑定 事件委托是一种利用事件冒泡原理的动态事件绑定技术。通过将事件绑定到父元素上,可以在父元素上捕获子元素触发的事件。...3.在父元素的事件处理函数中,通过判断事件的目标元素,确定要执行的操作。 总结 动态事件添加是前端开发中实现交互性的重要手段。通过动态事件添加,我们可以实现灵活、可扩展的交互效果,减少重复代码的编写。

    1.2K20

    详解JavaScript中的变量提升函数提升

    但只有声明本身会被提升,而赋值或其他运行逻辑会留在原地 javascript并不是严格的自上而下执行的语言 变量声明提升: 1....JavaScript的变量提升是针对var的,而let和const不存在变量提升这一特性(let与const具有一个临时死区的概念,后续在es6的总结中会提到) 2.通过var定义的变量,在定义语句之前就可以访问到...var a = 200, 所以 var a会被提升到fn的作用域顶端,第一输出则为undefined 下面这段代码,由于es6之前,js是没有块级作用域的,所以 if 中声明的a变量会被当成全局变量处理...a没有使用var定义,会造成zxx函数中没有变量声明,所以zxx里面访问的变量a,其实都是访问的全局变量a,a = 20 又相当于给全局变量a重新赋值20 函数声明提升 通过function声明的函数,...当前函数声明和变量声明使用同一个变量名称时,函数的优先级高于变量的优先级 console.log(zxx) // 会输出zxx定义的函数 function zxx () {

    2.4K30

    javascript中的变量提升的简单说明

    这就要从js中变量的提升和函数作用域来说起了。 首先我们定义了两个变量。都名为smh,其中一个位于全局作用域中,另一个位于函数作用域中。...大家会认为第一个输出会报错,因为变量的声明在输出在后,第二个输出会打印出“全局”,因为第二个变量声明也是声明于打印之后,这就要从js中的变量的提升说起了。...上述代码一共有两个执行环境,以下是“Javascript高级程序设计”中对于作用域的解释 当代码在一个环境中执行时,会创建变量对象的一个作用域链( scope chain)。...如果这个环境是函数,则将其活动对象( activation object)作为变量对象。活动对象在最开始时只包含一个变量,即 arguments对象(这个对象在全局环境中是不存在的)。...作用域链中的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。这样,一直延续到全局执行环境;全局执行环境的变量对象始终都是作用域链中的最后一个对象。

    98800

    webpack中动态import()打包后的文件名称定义

    动态import()打包出来文件的name是按照0,1,2...依次排列,如0.js、1.js等,有的时候我们希望打包出来的文件名是打包前的文件名称。...要实现这,需要经历3个步骤: 1.在webpack配置文件中的output中添加chunkFilename。命名规则根据自己的项目来定,其中[name]就是文件名,这一块更详细的说明请点击这里。...[hash:8].js',//动态import文件名 }, //其他代码... 2.在动态import()代码处添加注释webpackChunkName告诉webpack打包后的chunk的名称(注释中的内容很重要.../containers/MyFile`) 3.大多数情况下我们使用动态import()是通过循环来做的,这样我们就不得不引入变量了,使用[request]来告诉webpack,这里的值是根据后面传入的字符串来决定...,本例中就是变量pathName的值,具体如下: import(/* webpackChunkName: "[request]" */`..

    3.3K20

    《解构this:JavaScript中动态指向的隐秘逻辑》

    this始终是一个充满矛盾的存在—它既不是固定不变的标识,也不是随机游走的变量,而是像一个根据场景变换身份的角色,在不同语境中呈现出截然不同的面貌。...理解this的指向,从来不是记住几条规则那么简单,而是要穿透语法的表象,触摸到语言设计中“上下文优先”的深层逻辑。this的核心本质,是动作执行时的“在场主体”。...就像日常生活中说“我做了这件事”,“我”的指向会随说话人变化,JavaScript中this的指向,始终与“谁在执行当前动作”这一问题紧密绑定。...this的指向很少在定义时确定,更多是在执行的瞬间由语境决定,这种“延迟绑定”的特性,藏着JavaScript对动态场景的适应性智慧。函数被嵌套调用时,this的指向常常会发生出人意料的变化。...this的指向问题,本质上是JavaScript对“行为与主体”关系的语言表达。它的复杂恰恰体现了现实世界中身份与场景的关联性——同一个行为,因执行主体和语境不同,其意义和后果会大相径庭。

    13400

    4种在JavaScript中交换变量的方法

    许多算法需要交换2个变量。在编码面试中,可能会问您“如何在没有临时变量的情况下交换2个变量?”。我很高兴知道执行变量交换的多种方法。...在本文中,您将了解大约4种交换方式(2种使用额外的内存,而2种不使用额外的内存)。 1、解构赋值 解构赋值语法(ES2015的功能)使您可以将数组的项提取到变量中。...对于大多数情况,我建议使用解构赋值来交换变量。 2、 临时变量 使用临时变量交换变量是经典的。顾名思义,这种方法需要一个额外的临时变量。...提醒一下,这是 XOR 真值表: a b a ^ b 0 0 0 1 1 0 0 1 1 1 0 1 在JavaScript中,按位 XOR 运算符 n1 ^ n2 对n1和n2数字的每一位执行 XOR...5、结论 JavaScript提供了很多交换变量的好方法,无论有没有额外的内存。 我建议使用的第一种方法通过应用解构赋值[a,b] = [b,a]交换变量。这是一种简短而富有表现力的方法。

    4.5K30

    JavaScript中变量声明var、let、const的区别

    在ES6之前,声明变量我们使用var,在ES2015(ES6) 新增加了两个重要的 JavaScript 关键字: let 和 const。这样我们声明变量就有了三个关键字。...(x); // 0 函数外面使用var声明的变量,会挂在到window上,我们使用window点就可以访问到声明的变量,类似 window.x = 0 这种方式声明的变量,我们全局都可以访问...,所以在最外层使用var声明的变量的作用域是全局作用域。...ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。....; const 所不能改变的并不是值,而是变量指向的内存地址所保存的值不能变动,下面看图 ? 对于简单类型(数值、字符串、布尔值),值就保存在变量所指向的内存地址中。

    2.2K1411

    javascript中变量提升以及处理方法

    很久没更新文章了,主要是懒,还有学校的作业,所以抽不开时间。 今天我们来说说js中变量提升,for循环作用域在使用过程中遇到的一些问题,并解决。...在我以前的文章中:javascript中的变量提升的简单说明 ,中已经说了变量提升的要点了,所以我这篇不赘述,这篇和此篇有一些关联性,所以我希望各位可以先看完javascript中的变量提升的简单说明在来观看此篇文章...首先第一个知识点,就是作用域,js的for循环是没有作用域的,跟java,c#这类后端语言不一样,在for中定义的变量,所以i这个变量是在全局上的。...然后第二个知识点,就是变量提升,js把i这个变量提升到作用域的顶端,不赋值。这里听不懂赶紧回去看javascript中的变量提升的简单说明。...使用let来声明变量i,这是es6的新语法,使用let之后,在for中就有自己的作用域,把var换成let即可,代码省略。

    1.1K20

    Netty中的线程名称

    在之前的文章中我们讨论过NioEventLoop创建过程. 创建的第一个步骤就是创建线程执行器ThreadPerTaskExecutor, 这个线程执行器就是用来创建Netty底层的线程的....在学习Java的Thread时候,线程默认名称类似thread-0,thread-1,thread-2...以此类推....而线程的名称对于我们排查问题的时候也是起到很大作用的, 因此我们在设计线程池, 也会根据一定的规则给线程池中的线程命名, 这也是一个好的习惯....因此我们示例中的nioEventLoop-2-1的数字2就表示第2个线程池的意思. 也就是nioEventLoop-2-1这个名字的线程是在第2个线程池中的....所以示例nioEventLoop-2-1中的数字1就是表示线程池中的第1个线程, 整体就表示第2个线程池中的第1个线程.

    1.9K30

    JavaScript 中的变量如何声明和初始化?

    在 JavaScript 中,变量的声明和初始化可以通过以下几种方式进行: 1:使用 var 关键字声明和初始化变量: var x; // 声明一个变量 x,但未初始化 var y = 10; // 声明并初始化变量...y,赋值为 10 在使用 var 声明变量时,可以在声明的同时进行初始化,也可以只声明而不初始化,后续再进行赋值。...使用 let 声明的变量只在声明的块级作用域中有效。...4:变量的动态初始化: let x; // 声明一个变量 x x = 5; // 初始化变量 x,赋值为 5 可以先声明一个变量,然后在之后的代码中进行初始化赋值。...无论使用 var、let 还是 const 声明变量,都可以在声明的同时进行初始化,也可以单独进行初始化。

    54910

    JavaScript 中如何判断变量是否为数字

    作者: Marcus Sanatan 译者:前端小智 来源:stackabuse 简介 JavaScript 是一种动态类型语言,这意味着解释器在运行时确定变量的类型。...实际上,这也允许我们在相同的代码中使用相同的变量来存储不同类型的数据。如果没有文档和一致性,我们在使用代码时并不总是知道变量的类型。...当我们期望一个变量是数字时,对字符串或数组进行操作可能会在代码中导致奇怪的结果。在本文中,我们将会介绍一些判断变量是否为数字的函数。 像"10"之类的数字的字符串不应被接受。...在JavaScript中,诸如NaN,Infinity和-Infinity之类的特殊值也是数字类型的。 根据这些要求,最好使用的函数是内置Number对象中的isFinite()函数。...尽管从技术上来说这是正确的结果,但NaN和Infinity是特殊的数字值,对于大多数使用情况,我们宁愿忽略它们。 总结 在本文中,我们学习了如何检查JavaScript中的变量是否为数字。

    3.8K10

    一文带你弄懂JavaScript中的变量提升

    01 js变量提升 JavaScript是单线程语言,所以执行肯定是按顺序执行。但是并不是逐行的分析和执行,而是一段一段地分析执行,会先进行编译阶段然后才是执行阶段。...在编译阶段阶段,代码真正执行前的几毫秒,会检测到所有的变量和函数声明,所有这些函数和变量声明都被添加到名为Lexical Environment的JavaScript数据结构内的内存中。...先从一个简单的例子来入手: a = 2; var a; console.log(a); 以上的代码会输出什么,假如这段代码是从上到下执行的话,肯定会输出undefined,然而JavaScript...刚刚说过,JavaScript会将变量的声明提升到顶部,但是赋值语句是不会提升的,对于js来说,var a = 2是分为两步解析的: 第一步:var a; 第二步:a = 2;...变量提升的本质其实是js引擎在编译的时候,就将所有的变量声明了,因此在执行的时候,所有的变量都已经完成声明。 3. 当有多个同名变量的时候,函数声明会覆盖其他的声明。

    58140
    领券