JS中的var、let、const
1、var
在全局window中申明则为全局变量,是全局对象 window 的属性。
- var sum = 0
- console.log(window.sum) //
- console.log(sum); //
在函数中申明的变量则为局部变量
- function foo(){
- function bar(a){
- i = 3;
- console.log( a + i ); // 3 之后是无限循环11
- }
- var i = 0
- for( i ; i <= 10; i++){
- bar( i * 2 )
- }
- }
- foo()
这段代码可以写成这样
- function foo(){
- function bar(a){
- i = 3;
- console.log( a + i );
- }
- var i
- i = 0
- for( i ; i <= 10; i++){
- bar( i * 2 )
- }
- }
- foo()
函数提升先于变量提升,进入for循环之后把bar函数的参数为 0,所以第一次输出打印为 3,重点在这个地方 i = 3,他会现在当前作用域中寻找 i 的申明,如果没有就会沿着作用域链向上查找,在 foo 中找到了,所以 foo 中的 i 就变成了 3,在执行过 i++ 之后就得到了 i= 4,在执行bar的时候就得到了之后的 11 这样一直循环
2、let 和 const
ES6 新增的两种申明变量的方式。不允许在相同作用域内重复声明同一个变量,不存在变量提升
既然不存在变量提升,那么在变量申明之前就不能用这个变量,var 申明的变量会进行变量提升,但是值是 undefined
在ES5的时候只有函数是块级作用域,但是在ES6中就不单单只有函数作用域了,这个要归功于 let 和 const
- var b = 1;
- {
- let b = 2;
- }
- console.log(b); //
花括号这一块就相当于一个块级作用域
- var a = []
- for(let i=0; i<10;i++){
- a[i] = function(){
- console.log(i);
- };
- console.log(i) //[function,function..] 总共10个
- }
- console.log(a)
- a[8]() //
把这个地方的 let 改成 var 之后,会发现所有的输出都会变成 10。
var 申明的 i 其实是一个全局的变量,和数组 a 是同一个级别的。for 循环每次改变 i 的值都是在原值的基础上重新复制,等循环结束的时候 i = 10, 所以不管怎么调用输出的都是10
let 申明的 i 只在 当前这个块有效,每轮循环都有一个块,所以每次循环的时候都是新创建了一个变量 i
cont和 let 有一个不同之处,就是const 用来申明常量。一旦申明,其值就不能改变。但是如果 const 申明的是一个引用类型的值
- const a = {}
- a.name = 'circle'
- console.log(a); // Object {name: "circle"}
const 里面保存的是这个对象的地址值,所以它只能保证这个地址值不变,而不能保证这个对象里面的属性之类的不能变
JS中的var、let、const的更多相关文章
- 【JS学习】var let const声明变量的异同点
[JS学习]var let const声明变量的异同点 前言: 本博客系列为学习后盾人js教程过程中的记录与产出,如果对你有帮助,欢迎关注,点赞,分享.不足之处也欢迎指正,作者会积极思考与改正. 总述 ...
- js中加“var”和不加“var”的区别
JavaScript 拥有动态类型.这意味着相同的变量可用作不同的类型: var x // x 为 undefined var x = 6; // x 为数字 var x = "Bill&q ...
- ES6中的var let const应如何选择
javascript世界里面的每个人都在说有关ECMAScript 6 (ES6,也称作ES 2015)的话题,对象的巨大变化 ( 类 , super() , 等), 函数 (默认参数等), 以及模块 ...
- JS中的var、let、const三者的区别
ES5:var ES6:let.const ES5中的作用域有---全局作用域.函数作用域 ES6中新增了---块级作用域(块级作用域由{}包裹,if语句.for语句中的{}也属于块 ...
- javascript中的var,let,const关键字
文章:JavaScript 中 var 和 let 和 const 关键字的区别 比较全面的文章.
- 在vue中let var 和const 区别
let和const 使用方法: (1).有没有感觉到在 javascript 使用var会发生变量提升,即脚本开始运行时, 变量已经存在了,但是没有值,所以会输出undefined. 而 ...
- ECMAScript 6中的var,let,const
var的变量提升 console.log(a); //输出undefined ; 他的实际执行顺序是: var a: console.log(a); a= 这就是var的变量提升 const命令的用法 ...
- js中的var
vars变量预解析 JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析).当你使用了一 ...
- js中加“var”和不加“var”的区别,看完觉得这么多年js白学了
Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的.可以正常运行的代码并不代表是合适的代码. var num = 1: 是在 ...
随机推荐
- [转]理解js中的原型链,prototype与__proto__的关系
本文转自:http://rockyuse.iteye.com/blog/1426510 说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: 1 <script typ ...
- (转)IBM AIX系统硬件信息查看命令(shell脚本)
IBM AIX系统硬件信息查看命令(shell脚本) 原文:http://blog.itpub.net/22085031/viewspace-1054015/ 查看IBM AIX系统的主机型号.序列号 ...
- css有关鼠标移动上去图片变透明度变化
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Jersey前后端交互初体验
一 get请求 前端 基本的GET请求 $.ajax({ type : "get", url : "../rest/api/account/delete", d ...
- c++隐式类型转换和explicit
什么是隐式转换? 众所周知,C++的基本类型中并非完全的对立,部分数据类型之间是可以进行隐式转换的. 所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为.很多时候用户可能都不知道进行了哪些 ...
- Java基础入门 - 三种注释及文档注释详解
类似C/C++,Java也支持单行和多行注释 注释中的字符在编译时会被忽略 注释通常为类.变量和方法的主要描述 单行注释 // 注释内容 多行注释 /* 注释内容 */ /* * 注释内容 */ 文档 ...
- Python元组类型、字典类型及常用操作
一.元组类型 1.用途 记录多个值,当多个值没有改的需求,此时用元组更合适,Python的元组与列表类似,不同之处在于元组的元素不能修改. 2.定义方式 在()内用逗号分隔开多个任意类型的值 t=(1 ...
- Android打包异常
Android在打包的时候,报错: 找不到类,或者打包之后运行找不到类,都可以在混淆文件中添加这个属性: -dontoptimize 通过测试,都可以解决. 来自为知笔记(Wiz)
- SQL SERVER 错误代码 0x534
解决办法就是修改一下登陆名: ALTER LOGIN [G-PC\zqwang] WITH NAME=[新的机器名\zqwang]; 然后查询一下 Service Broker 队列, 里面已经有 ...
- nginx启动时报错
nginx启动时报错 原因:nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed /var/cache/ngin ...