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

JS 变量提升

今天去面试了,总体感觉很不错,整个公司还有人的气氛都很棒,希望能顺利通过。 问到 JS 一些细节问题的时候发挥比较糟糕,有些是知道反应得太慢,有些是压根没接触过,还是积累的太少了。...这篇的 JS 变量提升问题就是从没有接触过的,网上一搜一大把,实在是不应该。为了不给信息爆炸添砖加瓦。。。照例尝试就这个问题扯一些别的理解。...,但对变量提升的具体行为则不了解了。...而后又被赋值 10 ,至于全局变量 foo 完全没参与进来。 虽然考点是变量提升,但个人认为,答出变量提升顶多合格分,这道题还有更实用的现实意义。 ---- 由于 !...即使开发者了解变量提升,如果看漏了下面的 var foo 很容易就会误认为是在使用全局的 foo 。只要函数体稍微复杂一点,这种事情就很容易发生了。

7K20

理解js的变量提升

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

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

    js变量提升 和函数提升

    两个最简单的例子理解变量声明提升和函数声明提升 一、变量提升 变量提升即将变量声明提升到它所在作用域的最开始的部分 例1: function fn () { var a ="hello...var b;    console.log(b); //undefined b = 'hello world2'; } 因为变量提升,很简单,就是把变量提升提到函数的最...但是我需要说明的是,变量提升 只是提升变量的声明,并不会把赋值也提升上来 二、函数提升 js中创建函数有两种方式:一种是函数表达式,另外一种是函数声明方式。只有函数声明才存在函数提升!...() {} 总结和注意点 1、变量提升 1、通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用域的顶端,然后进行接下来的处理 2、如果当前作用域中存在此变量声明...3、函数的优先权是最高的,它永远被提升至作用域最顶部,然后才是函数表达式和变量按顺序执行

    1.4K41

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

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

    1.5K30

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

    (本篇着重现象,原理详见 JS入门难点解析5-变量对象) 1. JavaScript是否需要编译 这节内容并不会对此做深层次的探讨,而是普及一个知识。...难道JS不是一行行顺序执行的吗?...而本篇文章所要讨论的内容——JS的变量提升和函数提升就发生在编译阶段。(随着自己进一步了解执行上下文,觉得这里所指的编译器的作用有点类似于执行上下文生命周期的第一阶段)。 2....而我们接下来要讨论的变量提升和函数提升实质上指的是变量声明提升和函数声明提升,赋值操作会留在原地。 3. 变量提升 所谓变量提升,就是变量的声明在执行前会被提升到该作用域顶部。...函数提升 所谓函数提升,就是函数的声明在执行前会被提升到该作用域顶部。这里参考变量提升,很容易理解。

    1.3K30

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

    大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说js中全局变量_var变量提升原理,希望能够帮助大家进步!!!...,所以在函数test执行前,由于第6行声明了局部变量a,所以函数内部的a都指向已经声明的局部变量,所以第4行输出100。...第7行输出结果为100,因为局部变量a在第3行已经被赋值了100,所以直接输出局部变量a的值。...行的a应该输出全局变量的值,而在函数执行之前已经声明过一个全局变量并赋值100,所以这里第上输出100。...第4行给全局变量a 重新赋值10,所以全局变量a的值变成10,所以第5行输出10。而在函数test外部,第8行输出全局变量a的值,因为全局变量被重新赋值为10,所以输出结果即为10。

    5.6K30

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

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

    79320

    【JS】347- 理解JavaScript中的变量、范围和提升

    本教程将介绍什么是变量,如何声明和命名变量,并进一步研究var、let和const之间的区别。我们还将回顾提升的影响以及全局和局部作用域对变量行为的重要性。 理解变量 变量是用于存储值的命名容器。...三者之间的区别是基于范围、提升和重新分配。...通常建议声明块范围的变量,因为它们生成的代码不太可能无意中覆盖变量值。 变量提升 到目前为止,在大多数示例中,我们已经使用var声明了一个变量,并使用一个值初始化了它。...由于let和const是块范围的,所以它们不会以这种方式提升,如下所示。...(y); 输出: Uncaught SyntaxError: Identifier 'y' has already been declared 总之,使用var引入的变量有可能受到提升的影响,提升是JavaScript

    1.8K10

    变量提升

    摘自廖雪峰网站 JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部: 'use strict'; function foo() { var...但是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的这一怪异的“特性”,我们在函数内部定义变量时,请严格遵守“在函数内部首先申明所有变量...最常见的做法是用一个var申明函数内部用到的所有变量: function foo() { var x = 1, // x初始化为1 y = x + 1, // y

    36710

    变量提升

    Hoisting(变量提升)是 JavaScript 中的一种行为,它在编译阶段将变量和函数声明提升到其所在作用域的顶部。...这就是 JavaScript 中 hoisting 的魔力。这段代码正常工作是因为 notEqual() 通过函数声明创建,并被提升到作用域的顶部。好的,再来看一个例子并猜测它的输出。...console.log(name);var name = "John";这段代码的输出是 undefined,不会出错,也不会抛出错误,也不会打印赋给 name 变量的值 'John'。...让我们理解 JavaScript 的这种行为。Hoisting 影响变量的生命周期,包括 3 个步骤:声明 - 创建一个新的变量。初始化 - 用一个值初始化变量。使用 - 访问和使用变量的值。...变量 name 的 hoisting 带有 let 和 const使用 let 和 const 声明的变量会被 hoist,但不会被初始化为默认值。

    19010

    JavaScript变量提升

    var a; console.log(a); // undefined a = 1; console.log(a); // 1 let/const的变量提升 let与const都具有块级作用域,对于变量提升的相关问题的表现是相同的...JS中无论哪种形式声明var、let、const、function、function*、class都会存在提升现象,不同的是var,function,function*的声明会在提升时进行初始化赋值为undefined...,因此访问这些变量的时候,不会报ReferenceError异常,而使用let,const,class声明的变量,被提升后不会被初始化,这些变量所处的状态被称为temporal dead zone,此时如果访问这些变量会抛出...s(); // 1 function s(){ console.log(1); } 函数表达式只会提升变量的声明,本质上是变量提升并将一个匿名函数对象赋值给变量。...也就是说,同一作用域下提升,函数会在更前面。即在JS引擎的执行的优先级是函数声明、变量声明、变量赋值。

    91310

    JavaScript 变量提升

    变量提升是一个将变量声明或者函数声明提升到作用域起始处的过程,即变量声明 var 和函数声明 function fun() {..} 在会发生变量提升过程。...但对于 ES2015 引入的 let ,变量提升是不能准确描述其变量初始化过程和可用性判断的,即 let 变量提升是不同寻常的。...在赋值阶段 varibale = 'some value' ,赋值语句使得变量得到新的赋值。 对于 var ,变量提升指 var 变量的声明阶段和初始化阶段得到提升,并且这两阶段之间没有任何的间隙。...bar() { console.log(2); } function foo() { console.log(3); } foo(); // 2 let 变量的生命周期 let 的提升是只针对声明阶段的提升...结论 至此,我们知道变量提升分为三种: var 只有声明阶段和初始化阶段被提升。 function 的声明阶段、初始化阶段和赋值阶段都被提升。 let 只有声明阶段被提升。

    88530

    揭秘变量提升

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

    65630

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

    什么是变量/函数提升 包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理,这种现象称为提升。...但只有声明本身会被提升,而赋值或其他运行逻辑会留在原地 javascript并不是严格的自上而下执行的语言 变量声明提升: 1....JavaScript的变量提升是针对var的,而let和const不存在变量提升这一特性(let与const具有一个临时死区的概念,后续在es6的总结中会提到) 2.通过var定义的变量,在定义语句之前就可以访问到...值:undefined 3.变量提升就是变量会被提升到作用域的最顶上去,也就是该变量不管是在作用域的哪个地方声明的,都会提升到作用域的最顶上去。...fn的作用域顶端,第一输出则为undefined 下面这段代码,由于es6之前,js是没有块级作用域的,所以 if 中声明的a变量会被当成全局变量处理 var a = 1 if (true

    1.5K30

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

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

    74710
    领券