近期学习es6后对变量提升及let和const的一点思考
1、变量提升:(创建->初始化)-->赋值-->修改
就是说,以var声明的变量,它的声明会被提升到当前作用域的顶端(注意是变量声明提升,变量的赋值没有提升)
//在if语句中也会提升,跟js的解析顺序有关
<script>
console.log(a);//undefined
var a = 10;
function test(){
console.log(a);//undefined
if(false){
var a =12;
}
console.log(a);//undefined
if(true){
var a =12;
}
console.log(a);//12
}
test();
console.log(a);//10
</script>
2 、那么如果用let和const声明的变量是否会提升?let和const是块级作用域,且存在死区的概念
<script>
var a = 10;
function test(){
console.log(a);//Cannot access 'a' before initialization
let a = 12;//or const a = 12;
console.log(a);//
}
test();
console.log(a);//
</script>
得出结论:let和const,不适用于变量提升;let和const有着'临时性死区'的概念,即从作用域开始到变量申明的这一部分,不能使用该变量,否则会报错。
3 、函数的声明提升:
函数声明方式有三种:
函数声明:function test(){};
函数表达式:var test = function(){};
其中 函数声明将会被提升:
可以看出js中函数不存在重载的概念,后面一个同名函数会覆盖掉前面一个同名函数
4 、函数声明高于变量声明: //函数声明提升比变量声明提升的快,同时会忽略对同名变量的二次申明
<script>
console.log(test);/*输出:ƒ test(){console.log("函数申明");}*/
function test(){
console.log("函数申明");
}
var test;
console.log(test);/*输出:ƒ test(){console.log("函数申明");}*/
var test = 1;
console.log(test);//
</script>
5 、关于let,const的思考
const声明的变量如果包含引用类型的调用,是可以修改变量里引用类型指向的数据的
let和const声明的全局变量不会被定义成顶层对象的属性
let和const不能重复声明一个同名变量,是因为同名变量在栈中的地址问题?
js中数据分为基本和引用,存储在栈和堆中,var声明的变量,和let和const声明的在栈和堆中存储的方式是否有什么不同?
近期学习es6后对变量提升及let和const的一点思考的更多相关文章
- 关于JS中变量提升的规则和原理的一点理解
关于变量提升,以前在一些教程和书籍上都听到过,平时开发中也知道有这个规律,但是今天突然在一个公开课中听到时,第一反应时一脸懵逼,然后一百度,瞬间觉得好熟悉啊,差点被这个概念给唬住了,不信我给你 ...
- 关于JS中变量提升的规则和原理的一点理解(二)
上篇文章中讲到变量提升和函数提升的先后顺序时蒙了,后来去查了一下资料,特别整理一下. 在<你不知道的JavaScript(上卷)>一书的第40页中写到:函数会首先被提升,然后才是变量. 书 ...
- ES6 - 基础学习(2): 新的变量声明方式 let 与 const
ES6)新增加了两个重要的 JavaScript 关键字:let 和 const.以前声明变量时只有一种方式:var,ES6对声明方式进行了扩展,现在可以有三种声明方式了. 1.var:variabl ...
- 开始学习es6(二) let 与 const 及 块级作用域
1.var JavaScript中,我们通常说的作用域是函数作用域,使用var声明的变量,无论是在代码的哪个地方声明的,都会提升到当前作用域的最顶部,这种行为叫做变量提升(Hoisting) cons ...
- ES6学习笔记(一)新的变量定义命令let和const
1.一些历史 ES6(ECMAScript 6.0)是 JavaScript 语言的新一代标准,于2015 年 6 月正式发布,距今已经4年了,它的目标,是使得 JavaScript 语言可以用来编写 ...
- JS 作用域与变量提升---JS 学习笔记(三)
你知道下面的JavaScript代码执行时会输出什么吗? var foo = 1; function bar() { if (!foo) { var foo = 10; } console.log(f ...
- ES6学习之let声明变量的学习
1.let和var类似, (1)let与var不同的点:let没有预编译,变量提升这个过程,let声明的变量只能在当前作用域内访问到(一个{}可以看做是一个作用域),在全局var声明的变量属于wind ...
- es6 学习1 let表示变量 、const表示常量 与 var 变量的区别
一.let 1.看下代码,在函数中无论在哪里声明变量,都会自动提到函数顶部,这就是函数变量提升,它的作用于为当前函数中. function aa() { if(bool) { var test = ' ...
- 【系统学习ES6】第一节:新的声明方式
[系统学习ES6] 本专题旨在对ES6的常用技术点进行系统性梳理,帮助大家对其有更好的掌握.计划每周更新1-2篇,希望大家有所收获. 以前用ES5时,声明变量只能用var.ES6的出现,为我们带来了两 ...
随机推荐
- html5视频常用API接口
一.虽然有的属性是boolean类型,但仍旧建议按照XHTML书写(属性名=”属性值”)格式,避免出现错误 (下面加粗的属性为常用属性) 属性 值 功能描述 controls controls 是否显 ...
- 常见Failed to load ApplicationContext异常解决方案!!
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...
- ZGC gc策略及回收过程-源码分析
源码文件:/src/hotspot/share/gc/z/zDirector.cpp 一.回收策略 main入口函数: void ZDirector::run_service() { // Main ...
- windows下bower init 报错: bower ENOINT Register requires an interactive shell
windows下bower初始化时不应该在git bash中,而应该在cmd下打开的dos窗口中进行
- samba文件共享服务部署
1.安装samaba服务程序 yum install -y samba 2.查看smaba文件,由于注释空行较多,选择过滤 egrep -v "#|;|^$" /etc/samba ...
- PHP array_udiff_uassoc
1.函数的参数:返回数组的差集.用定义的函数比较键值和值. 2.函数的参数: @params array $array @params array $array1 ... @params callab ...
- 程序猿的产品思考:2C与2B产品思维的区别
原创/朱季谦 我最早接触到互联网产品的时候,听到最多的,是做产品要有用户思维,即站在用户角度去看待产品.这个先入为主的概念,在很长一段时间里,都被我效作经典.然而也在很长一段时间里,我竟混淆了其中 ...
- [NOIp2011] luogu P1311 选择客栈
我妈的抽象歌曲真 nb. 题目描述 给你 nnn 个点,每个点有两个参数 ci,dic_i,d_ici,di,给你一个数 DDD.定义一种方案合法,当且仅当你选出整数 i,j∈[1,n],i< ...
- The Mininum Function Value (luoguP2085 最小函数值)
Background\text{Background}Background 1. CSDN's been upgraded today. There's one MORE ad for each pa ...
- Redis集群与高可用性技术小结
客户端分片,这种方式需要实现特定的客户端,需要手工配置redis实例并根据算法进行访问,对于redis实例的增减,调整灵活性很差,一般不推荐. 代理分片,常见的有Twemproxy架构(豆瓣创建了co ...