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

JS 变量提升

问到 JS 一些细节问题的时候发挥比较糟糕,有些是知道反应得太慢,有些是压根没接触过,还是积累的太少了。这篇的 JS 变量提升问题就是从没有接触过的,网上一搜一大把,实在是不应该。...,但对变量提升的具体行为则不了解了。...(大意是这样,书没在手边,不确认了) 当时不太理解没有块级作用域为什么会影响这个,现在了解了变量提升就很容易理解了。...而后又被赋值 10 ,至于全局变量 foo 完全没参与进来。 虽然考点是变量提升,但个人认为,答出变量提升顶多合格分,这道题还有更实用的现实意义。 ---- 由于 !...即使开发者了解变量提升,如果看漏了下面的 var foo 很容易就会误认为是在使用全局的 foo 。只要函数体稍微复杂一点,这种事情就很容易发生了。

6.9K20

js变量提升 和函数提升

两个最简单的例子理解变量声明提升和函数声明提升 一、变量提升 变量提升即将变量声明提升到它所在作用域的最开始的部分 例1: function fn () { var a ="hello...,很简单,就是把变量提升提到函数的最top的地方。...但是我需要说明的是,变量提升 只是提升变量的声明,并不会把赋值也提升上来 二、函数提升 js中创建函数有两种方式:一种是函数表达式,另外一种是函数声明方式。只有函数声明才存在函数提升!...、通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用域的顶端,然后进行接下来的处理 2、如果当前作用域中存在此变量声明,无论它在什么地方声明,引用此变量时就会在当前作用域中查找...,不会去外层作用域了 3、let和const关键字没有变量提升 2、函数提升 1、如果在同一个作用域中存在多个同名函数声明,后面出现的将会覆盖前面的函数声明 2、函数声明的优先级最高,会被提升至当前作用域最顶端

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

理解js变量提升

深刻理解变量提升 当执行 JS 代码时,会生成执行环境,只要代码不是写在函数中的,就是在全局执行环境中,函数中的代码会产生函数执行环境,只此两种执行环境。...undefined var a = 'Hello world' function b() { console.log('call b') } 想必以上的输出大家肯定都已经明白了,这是因为函数和变量提升的原因...第一个阶段是创建的阶段,JS 解释器会找出需要提升变量和函数,并且给他们提前在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明并且赋值为 undefined,所以在第二个阶段,也就是代码执行阶段...在提升的过程中,相同的函数会覆盖上一个函数,并且函数优先于变量提升 b() // call b second function b() { console.log('call b fist')...let 不能在声明前使用,但是这并不是常说的 let 不会提升,let 提升了,在第一阶段内存也已经为他开辟好了空间,但是因为这个声明的特性导致了并不能在声明前使用。

5.5K20

js变量提升与函数提升的详细过程

js变量提升与函数提升的详细过程 先来看两个栗子,下面的两段代码分别输出什么?...这就涉及到js中的变量提升和函数提升的具体过程了。 1、变量提升 js是怎么创建变量的呢?...原本js定义变量的地方,在js运行到这里的时候,才会进行赋值操作,而没有运行到的变量,不会进行赋值操作。 所以变量提升提升的其实是变量的声明,而不是变量的赋值。...2、函数的提升 函数的提升变量提升类似,都是提升到作用域的最开始的位置,只不过变量提升是分两步的,第一步是变量声明的提升,第二步是变量的赋值。...,但是变量赋值的部分是在js原型到变量定义的位置才给变量赋值的,而函数提升是相当于直接剪切到最前面的。

1.5K30

js中全局变量_var变量提升原理

今天说一说js中全局变量_var变量提升原理,希望能够帮助大家进步!!!...),从而确定变量的作用域,所以在函数test执行前,由于第6行声明了局部变量a,所以函数内部的a都指向已经声明的局部变量,所以第4行输出100。...第7行输出结果为100,因为局部变量a在第3行已经被赋值了100,所以直接输出局部变量a的值。...,没用var声明的一般为全局变量,在test函数内,a=10声明了一个全局变量,所以第3行的a应该输出全局变量的值,而在函数执行之前已经声明过一个全局变量并赋值100,所以这里第上输出100。...第4行给全局变量a 重新赋值10,所以全局变量a的值变成10,所以第5行输出10。而在函数test外部,第8行输出全局变量a的值,因为全局变量被重新赋值为10,所以输出结果即为10。

5.6K30

【前端】:变量提升、this绑定、 优先级与关联性

变量提升(Hoisting) 2. this 绑定 2.1. this 是什么? 2.2. this 绑定规则 3. 运算符优先级与关联性 4. 几道笔试题 1....变量提升(Hoisting) Conceptually, for example, a strict definition of hoisting suggests that variable and...JS 引擎在执行代码之前会对代码进行编译,这一阶段会优先处理包括变量、函数在内的所有声明(提升就发生在这个时候)。 JavaScript 仅提升声明,而不提升初始化。...如果你先使用的变量,再声明并初始化它,变量的值将是 undefined。 函数声明与变量声明都会被提升。...函数会首先被提升,然后才是变量; 注意:对于函数来说,只有函数声明会被提升到顶部,而函数表达式不会被提升。 每个作用域都会进行提升操作。

44020

JS面试、技巧总结点一-变量提升函数提升

什么是变量/函数提升 包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理,这种现象称为提升。...但只有声明本身会被提升,而赋值或其他运行逻辑会留在原地 javascript并不是严格的自上而下执行的语言 变量声明提升: JavaScript的变量提升是针对var的,而let和const不存在变量提升这一特性...JS 解释器会找出需要提升变量和函数,并且给他们提前在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明并且赋值为 undefined, 第一个定义声明是在编译阶段进行的。...fn的作用域顶端,第一输出则为undefined 下面这段代码,由于es6之前,js是没有块级作用域的,所以 if 中声明的a变量会被当成全局变量处理 var a = 1 if (true) {...当前函数声明和变量声明使用同一个变量名称时,函数的优先级高于变量优先级 console.log(fx) // 会输出 fx 定义的函数 function fx () { console.log

75120

JS入门难点解析2-JS变量提升和函数提升

而本篇文章所要讨论的内容——JS变量提升和函数提升就发生在编译阶段。(随着自己进一步了解执行上下文,觉得这里所指的编译器的作用有点类似于执行上下文生命周期的第一阶段)。 2....而我们接下来要讨论的变量提升和函数提升实质上指的是变量声明提升和函数声明提升,赋值操作会留在原地。 3. 变量提升 所谓变量提升,就是变量的声明在执行前会被提升到该作用域顶部。...函数提升 所谓函数提升,就是函数的声明在执行前会被提升到该作用域顶部。这里参考变量提升,很容易理解。...'); } sayHello(); 5.提升优先级 既然声明的提升都是提升到当前作用域的顶端,那么如果两个声明拥有同一个名字的时候,谁才拥有对这个变量的冠名权呢?...5.3.png 说明函数声明优先级高于变量声明优先级

1.2K30

变量提升

摘自廖雪峰网站 JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量提升”到函数顶部: 'use strict'; function foo() { var...+ y; console.log(x); var y = 'Bob'; } foo(); 虽然是strict模式,但语句var x = 'Hello, ' + y;并不报错,原因是变量...但是console.log显示Hello, undefined,说明变量y的值为undefined。这正是因为JavaScript引擎自动提升变量y的声明,但不会提升变量y的赋值。...对于上述foo()函数,JavaScript引擎看到的代码相当于: function foo() { var y; // 提升变量y的申明,此时y为undefined var x = '...Hello, ' + y; console.log(x); y = 'Bob'; } 由于JavaScript的这一怪异的“特性”,我们在函数内部定义变量时,请严格遵守“在函数内部首先申明所有变量

34910

变量提升

Hoisting(变量提升)是 JavaScript 中的一种行为,它在编译阶段将变量和函数声明提升到其所在作用域的顶部。...这段代码正常工作是因为 notEqual() 通过函数声明创建,并被提升到作用域的顶部。好的,再来看一个例子并猜测它的输出。...Hoisting 影响变量的生命周期,包括 3 个步骤:声明 - 创建一个新的变量。初始化 - 用一个值初始化变量。使用 - 访问和使用变量的值。...变量 name 的 hoisting 带有 let 和 const使用 let 和 const 声明的变量会被 hoist,但不会被初始化为默认值。...注意 - 从声明语句到块的开始,let 和 const 变量处于一个临时死区(TDZ),无法被访问。我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

11510

JavaScript 变量提升

变量提升是一个将变量声明或者函数声明提升到作用域起始处的过程,即变量声明 var 和函数声明 function fun() {..} 在会发生变量提升过程。...但对于 ES2015 引入的 let ,变量提升是不能准确描述其变量初始化过程和可用性判断的,即 let 变量提升是不同寻常的。...对于 var ,变量提升指 var 变量的声明阶段和初始化阶段得到提升,并且这两阶段之间没有任何的间隙。...对于 function ,声明、初始化和赋值阶段在封闭的函数作用域的开头,便立即执行,其提升优先级比 var 和 let 提升优先级高。...结论 至此,我们知道变量提升分为三种: var 只有声明阶段和初始化阶段被提升。 function 的声明阶段、初始化阶段和赋值阶段都被提升。 let 只有声明阶段被提升

80430

JavaScript变量提升

JavaScript变量提升 在JavaScript中变量声明与函数声明都会被提升到作用域顶部,优先级依次为: 函数声明 变量声明 变量赋值。...JS中无论哪种形式声明var、let、const、function、function*、class都会存在提升现象,不同的是var,function,function*的声明会在提升时进行初始化赋值为undefined...s(); // 1 function s(){ console.log(1); } 函数表达式只会提升变量的声明,本质上是变量提升并将一个匿名函数对象赋值给变量。...var s = function(){ console.log(0); } function s(){ console.log(1); } s(); // 0 优先级JS中函数是第一等公民...也就是说,同一作用域下提升,函数会在更前面。即在JS引擎的执行的优先级是函数声明、变量声明、变量赋值。

86310

揭秘变量提升

引用 ES6 规范作者 Allen Wirfs-Brock一条最近的推特: 变量提升是一个陈旧且令人困惑的术语。...甚至在 ES6 之前:变量提升的意思究竟是“提升至当前作用域顶部”还是“从嵌套的代码块中提升到最近的函数或脚本作用域中”?还是两者都有?...进入变量作用域与执行声明之间的这段时间被称为该变量的 临时死区(TDZ): 在临时死区中,变量被认为是未初始化的(就像它有一个特殊的值一样)。...如果访问未初始化的变量,将得到ReferenceError 错误。 一旦执行到变量声明,该变量将被设置为初始化器的值(通过赋值符号指定),如果没有初始化,则为undefined。...var :变量提升(部分提前激活) var是在const和let之前声明变量的一种较老的方法。考虑下面的var声明。

62730

前端学习(34)~js学习(十一):作用域和变量提升

作用域的分类 全局作用域:作用于整个 script 标签内部,或者作用域一个独立的 JS 文件。 函数作用域(局部作用域):作用于函数内的代码环境。...说明 外层作用域 无法访问 内层作用域 里的变量 变量的作用域 根据作用域的不同,变量可以分为两类:全局变量、布局变量。 全局变量: 在全局作用域下声明的变量,叫「全局变量」。...(比如说,全局作用域和函数作用域都定义了变量a,如果想访问全局变量,可以使用window.a) 全局作用域 直接编写在script标签中的JS代码,都在全局作用域。...变量的声明提前(变量提升) 使用var关键字声明的变量( 比如 var a = 1),会在所有的代码执行之前被声明(但是不会赋值),但是如果声明变量时不是用var关键字(比如直接写a = 1),则变量不会被声明提前...} system.out.print(num); // 报错 但是,在 JS 中没有块级作用域(ES6之前)。

70010
领券