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

JS 变量提升

今天去面试了,总体感觉很不错,整个公司还有人气氛都很棒,希望能顺利通过。 问到 JS 一些细节问题时候发挥比较糟糕,有些是知道反应得太慢,有些是压根没接触过,还是积累太少了。...这篇 JS 变量提升问题就是从没有接触过,网上一搜一大把,实在是不应该。为了不给信息爆炸添砖加瓦。。。照例尝试就这个问题扯一些别的理解。...,但对变量提升具体行为则不了解了。...而后又被赋值 10 ,至于全局变量 foo 完全没参与进来。 虽然考点是变量提升,但个人认为,答出变量提升顶多合格分,这道题还有更实用现实意义。 ---- 由于 !...记得此前还听过一个类似的故事,一个 c 语言项目中隔三差五总会遇到在 if 比较相等结果写成了赋值语句产生 bug : if (a=1) { ... } 被这情况烦了多次之后,定下了这样一个要求

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) {

    78720

    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

    36610

    变量提升

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

    18710

    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引擎执行优先级是函数声明、变量声明、变量赋值。

    90910

    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 只有声明阶段被提升

    88230

    揭秘变量提升

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

    65030

    for循环变量闭包

    2016-12-12 14:25:09 很多情况我们在for循环会给一个数组元素定义事件,例如下面代码 for (var i = 0; i < 10; i++) { setTimeout(function...() { console.log(i); }, 100 * i); } 介绍一下,setTimeout会在若干毫秒延时后执行一个函数(等待其它代码执行完毕)。...让我们花点时间考虑在这个上下文情况。 setTimeout在若干毫秒后执行一个函数,并且是在for循环结束后。 for循环结束后,i值为10。 所以当函数被调用时候,它会打印出 10!...一个通常解决方法是使用立即执行函数表达式(IIFE)来捕获每次迭代时i值: for (var i = 0; i < 10; i++) { // capture the current state...参数 i会覆盖for循环i,但是因为我们起了同样名字,所以我们不用怎么改for循环体代码。

    1.2K20

    详解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
    领券