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

JS 变量提升

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

7K20

JS基础】JS中 Let 和 Const 变量区别

在 JavaScript 中,let 和 const 都是用于声明变量的关键字,但它们之间有一些重要的区别: 可变性: let 允许在声明之后更改变量的值。...这意味着您可以重新为使用 let 声明的变量分配任何类型的值: let x = 1; x = "text"; const 用于声明常量,一旦声明了变量,它的值就不能改变。...: x is not defined console.log(y); // ReferenceError: y is not defined 变量提升: 在执行代码之前,var 声明的变量会被提升到函数作用域的顶部...相反,let 和 const 声明的变量也会被提升,但是在被赋值之前,它们将处于临时性死区(TDZ),在这个阶段赋值操作将引发错误。...z = 3; 总之,let 和 const 是为了解决 var 声明的变量提升、作用域等问题而引入的新特性。

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

js变量提升 和函数提升

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

1.4K41

理解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

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

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

76420

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

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

1.2K30

const修饰指针变量详解

对于指针的认识,应该很多时候都是从C语言开始,那么const修饰的指针变量到底与指针变量有点什么区别呢?...“` const char *ptr; char const *ptr; char * const ptr; “` 上面三个const修饰的指针变量到底有点什么区别呢?...const 修饰的只是*ptr,*ptr呢?其实就是一个指针变量指向的内存区的内容,被const修饰之后,那么这个内存区的内容就不能够被修改了,但是指针的指向是可以被修改的。...对于**char * const ptr;**中的const修饰的就是ptr,ptr是什么呢?ptr不就是指针变量所存放的地址嘛?...加上const进行修饰之后,那么这个指针变量所存放的地址就不能够被修改了,但是指针指向的内容是可以被修改的。

32720

变量 var const let 的区别

var 声明提升:使用var时,下面代码不会报错,因为使用这个关键字声明的变量会自动提升到函数作用域顶部 function test(){ console.log(name); var...//var会提升 console.log(name) //undefined var name = 'bear'; //let 不会提升 console.log(age) //ReferenceError...} //会输出0 1 2 3 4 三、const声明 const 基本与 let相似,唯一一个重要区别是用它声明变量时必须同时初始化变量值,且尝试修改const声明的变量会导致运行的错误 1.给常量赋值...四、总结 1.不使用var ES6相当于把var的功能拆解成const和let,有了let和const,其实会发现不需要再用var了,限制自己使用const和let有助于代码质量的提升。...2.const优先 let次之 使用const声明可以让浏览器运行时强制保持变量不变,在这同时也能迅速发现意外赋值的这种非预期行为。简而言之就是const定义一些不会变的变量,会变的就用let定义。

48710

变量提升

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

14510

变量提升

摘自廖雪峰网站 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的这一怪异的“特性”,我们在函数内部定义变量时,请严格遵守“在函数内部首先申明所有变量

35710
领券