JavaScripts之变量作用域提升问题(var、let、const)
- 变量提升(Hoisting)
- var: 使用var在函数或全局内任何地方声明变量相当于在其内部
最顶上声明它,这种行为称为Hoisting(提升)
注意:变量赋值的位置不会改变
function fn() {
console.log(x) // -> undefined
var x = 2
}
// 等同于:
function fn() {
var x // 变量提升到函数最顶部
console.log(x)
x = 2 // 赋值的位置不变
}
- let/const: 使用 let/const 定义变量是存在块级作用域({...})的,它同样存在
变量提升,但是由于有临时死区的概念,导致变量在未初始化的时候是不能够使用的(所以看上去是没有变量提升的)
function fn() {
console.log(x) // 报错 -> Cannot access 'name' before initialization
// var -> let 使得 x 存在临时死区,在未初始化之前是无法被使用的
let x = 2
}
// 正确方式
function fn() {
let x = 2 // 定义并初始化
console.log(x) // -> 2
}
- var: 使用var在函数或全局内任何地方声明变量相当于在其内部
- 变量的作用域
var:只存在函数作用域和全局作用域// 使用 var 在函数外部定义变量,会提升到全局作用域
var globalA = c
function fn() {
if(true) {
// 会在函数顶部定义 a = undefind, 所以在下方的console.log中能够正常输出
// 这里其实是 a = 1 赋值的步骤
var a = 1
} console.log(a) // -> 1
}
const/let: 局部作用域({ ... })
console.log(curA) // -> Cannot access 'curA' before initialization
// 只能在初始化后才能使用 curA
const curA = 'ccc'
console.log(curA) // -> 'ccc'
function fn() {
if(true) {
console.log(a) // a is not defined
}
let a = 1
}
JavaScripts之变量作用域提升问题(var、let、const)的更多相关文章
- ES6和ES5变量声明的区别(var let const)
// es5的语法与es6的语法区别 // var let const console.log(name);//undefine,不会报错,因为变量声明会提到作用域的最前面 var name=&quo ...
- js 函数和变量的提升
js 函数和变量的提升 1. 函数的作用域: js中 ,函数的作用域为函数,而不是大括号. var hei = 123;if(true){ hei = 456;}console.log(hei);// ...
- javaScript的闭包 js变量作用域
js的闭包 js的变量作用域: var a=90; //定义一个全局变量 function test(){ a=123; //使用外层的 a变量 } test(); document.write(&q ...
- javascript中的变量作用域以及变量提升
在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...
- javascript中的变量作用域以及变量提升详细介绍
在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解变量作用域 “一个变量的作用域表示这个变量存在的上下文 ...
- JS高级. 05 词法作用域、变量名提升、作用域链、闭包
作用域 域,表示的是一个范围,作用域,就是作用范围. 作用域说明的是一个变量可以在什么地方被使用,什么地方不能被使用. 块级作用域 JavaScript中没有块级作用域 { var num = 123 ...
- js变量作用域--变量提升
1.JS作用域 在ES5中,js只有两种形式的作用域:全局作用域和函数作用域,在ES6中,新增了一个块级作用域(最近的大括号涵盖的范围),但是仅限于let方式申明的变量. 2.变量声明 var x; ...
- JavaScript 变量作用域和声明提升
一.变量作用域 说到这个概念,不有自主的想到this,scope 这两个关键字. JavaScript的this总是指向一个明确的对象,这个对象是在执行的时候动态绑定的.通俗的说就是谁调用我,我的th ...
- javaScript 变量提升 var let const,以及JS 的解析阶段和执行阶段
我们先来看一道面试题,大家猜想一下,下面这段代码,打印出来的结果是什么 var name = 'World!'; (function () { if (typeof name === 'undefin ...
随机推荐
- 【LeetCode】860. Lemonade Change 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- [Azure DevOps] 管理测试计划、测试套件和测试用例
我喜欢测试计划,它能让团队清楚测试进度,还能妥善分配测试人员,更重要的是它能保证测试质量和效率.Azure DevOps 里提供了 Test Plans 这个模块用于管理测试计划. 1. Azure ...
- nginx worker_cpu_affinity使用方法
Nginx默认没有开启利用多核CPU,我们可以通过增加worker_cpu_affinity配置参数来充分利用多核CPU.CPU是任务处理,计算最关键的资源,CPU核越多,性能就越好. 配置Nginx ...
- CSS基础 margin塌陷问题以及解决 办法
场景:两个相互嵌套的块级元素,父子元素相互紧贴margin-top会合并作用在父元素的子元素结果:导致两个盒子同时移动 解决方法: 1.给父元素设置overflow:hidden 2.给父元素设置浮动 ...
- BOM 点击触发 倒计时发送验证码案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Docker下安装Elasticsearch、ik分词器、kibana
1:使用docker拉取Elasticsearch镜像 docker pull elasticsearch:7.12.0(不加版本号默认是最新版本) 2:查看是否成功下载镜像 docker image ...
- linux 之 mysql数据库备份与恢复
备份 mysqldump -uroot -p123 --databases test > ~/test.sql --databases 指定数据库 恢复 mysql -uroot -p123 & ...
- 关于Mysql的Qcache优化
query_cache_size = 64M 指定MySQL查询缓冲区的大小.可以通过在MySQL控制台执行以下命令观察:# > SHOW VARIABLES LIKE '%query_cach ...
- c# - 常量定义与赋值
1.前言 c#与Java很相似,但是不一样,又与js(JavaScript)相似,但是也不一样,所以我认为c#是Java和 js的孩子. 2.常量定义 字符串: const string = &quo ...
- Centos7 暂时记录
chown 修改属主和属组信息 chown -R 对目录所有子的子目录和文件进行修改属主信息 w命令 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATroot ...