var和let的区别(详解)
1. 作用域
- 通过
var定义的变量,作用域是整个封闭函数,是全域的 。 - 通过
let定义的变量,作用域是在块级或是子块中。 
function varTest() {
  var x = 1;
  if (true) {
    var x = 2;  // 同样的变量!
    console.log(x);  //
  }
  console.log(x);  //
}
function letTest() {
  let x = 1;
  if (true) {
    let x = 2;  // 不同的变量
    console.log(x);  //
  }
  console.log(x);  //
}
2. 不可以在当前作用域重复声明同一个变量
在同一个函数或同一个作用域中用let重复定义一个变量将引起 TypeError
function letTest() {
  let x = 1;
  let x = 2;
  console.log(x);
}
letTest()  //  报错
3. 变量提升
var声明的变量由于存在变量提升(hoist),不论var声明的变量处于当前作用域的第几行,都会提升到作用域的头部。
var a = 1;
function foo(){
alert( a ); // undefined
var a = 2;
}
foo();
浏览器在运行代码之前会进行预解析,首先解析函数声明,定义变量,解析完之后再对函数、变量进行运行、赋值等。

那么let存在变量提升么?
let是存在变量提升的,在JavaScript中,所有的声明(var、function、let、const、class、function\*)都会存在变量提升,var声明的变量与let声明的变量区别在于初始化值的不同。
x = y = "global";
(function() {
x; // undefined
y; // Reference error: y is not defined var x = "local";
let y = "local";
}());
var 声明的变量会被提升到作用域的顶部并初始化为undefined,而let声明的变量在作用域的顶部未被初始化,直到let声明的语句被赋值,因此当使用这个值的时候会导致一个reference error的错误,在let声明变量之前被称为temporal dead zone,即临时死亡区。
4. let与for循环配合
for(let i = 0; i < 5 ; i++ ){
  setTimeout(function(){
    console.log(i)  // 0 1 2 3 4
  },1000)
}
此时打印出的结果为0 1 2 3 4 ,let与for循环使用时,其作用域是(let i = 0; i < 5 ; i++ ),但是ECMAScript规定,会在{}块级作用域中定义一个let j临时变量与(let i = 0; i < 5 ; i++ )中的i相等,因此setTimeout中的i指向不同的i。
for(var i = 0; i < 5 ; i++ ){
  setTimeout(function(){
    console.log(i)  // 5次5
  },1000)
}
而如果换成var之后, 由于i是函数级变量,5个内部函数都指向了同一个i ,而i最后一次赋值是5,因此打印出是5个5。
var和let的区别(详解)的更多相关文章
- ES6 新增声明变量的 var let const 的区别详解
		
var 如果使用关键字 var 声明一个变量,那么这个变量就属于当前的函数作用域,如果声明是发生在任何函数外的顶层声明,那么这个变量就属于全局作用域. let 1.let 声明的变量具有块作用域的特征 ...
 - javascript中=、==、===区别详解
		
javascript中=.==.===区别详解今天在项目开发过中发现在一个小问题.在判断n==""结果当n=0时 n==""结果也返回了true.虽然是个小问题 ...
 - Go学习——new()和 make()的区别详解(转载)
		
这篇文章主要介绍了Go语言中new()和 make()的区别详解,本文讲解了new 的主要特性.make 的主要特性,并对它们的区别做了总结,需要的朋友可以参考下 概述 Go 语言中的 new 和 m ...
 - JQ的offset().top与js的offsetTop区别详解
		
一.前言 最近在做一个图片懒加载的插件,就纵轴(Y轴)而言,我需要时时获取图片的上偏移量,好判断是否已进入视图区域,而我所理解的是offsetTop应该是跟offset().top一样的,然后陷入了因 ...
 - jQuery height()、innerHeight()、outerHeight()函数的区别详解
		
参考来源:http://www.jb51.net/article/84897.htm 代码示例(可复制到编辑器直接打开): <!DOCTYPE html> <html lang=&q ...
 - JQ的offset().top与JS的getBoundingClientRect区别详解,JS获取元素距离视窗顶部可变距离
		
壹 ❀ 引 我在 JQ的offset().top与js的offsetTop区别详解 这篇博客中详细分析了JQ方法offset().top与JS属性offsetTop的区别,并得出了一条offset( ...
 - 基于Java的打包jar、war、ear包的作用与区别详解
		
本篇文章,小编为大家介绍,基于Java的打包jar.war.ear包的作用与区别详解.需要的朋友参考下 以最终客户的角度来看,JAR文件就是一种封装,他们不需要知道jar文件中有多少个.cla ...
 - Android中Intent传值与Bundle传值的区别详解
		
Android中Intent传值与Bundle传值的区别详解 举个例子我现在要从A界面跳转到B界面或者C界面 这样的话 我就需要写2个Intent如果你还要涉及的传值的话 你的Intent就要写两 ...
 - php 去除html标记--strip_tags与htmlspecialchars的区别详解
		
php 去除html标记--strip_tags与htmlspecialchars的区别详解 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-26 本篇文章是对php中去除html ...
 
随机推荐
- 费用流(bzoj 3130)
			
Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络 ...
 - hdu 5691 Sitting in Line
			
传送门 Sitting in Line Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/O ...
 - SPOJ 1479 +SPOJ 666 无向树最小点覆盖 ,第二题要方案数,树形dp
			
题意:求一颗无向树的最小点覆盖. 本来一看是最小点覆盖,直接一下敲了二分图求最小割,TLE. 树形DP,叫的这么玄乎,本来是线性DP是线上往前\后推,而树形DP就是在树上,由叶子结点状态向根状态推. ...
 - (2)git本地生成SSH关联github
			
1.安装git 2.打开 Git Bash 输入ssh ,查看是否安装了ssh 这个界面是安装了的意思 3.生成ssh 输入ssh-keygen -t rsa 指令, 再连续按三次回车 会生成两个文件 ...
 - Codeforces 713C Sonya and Problem Wihtout a Legend(DP)
			
题目链接 Sonya and Problem Wihtout a Legend 题意 给定一个长度为n的序列,你可以对每个元素进行$+1$或$-1$的操作,每次操作代价为$1$. 求把原序列变成 ...
 - BZOJ 4034 [HAOI2015]树上操作(树链剖分)
			
题目链接 BZOJ4034 这道题树链剖分其实就可以了. 单点更新没问题. 相当于更新 [f[x], f[x]]这个区间. f[x]表示树链剖分之后每个点的新的标号. 区间更新的话类似DFS序,求出 ...
 - Spring Boot集成Spring Data Reids和Spring Session实现Session共享
			
首先,需要先集成Redis的支持,参考:http://www.cnblogs.com/EasonJim/p/7805665.html Spring Boot集成Spring Data Redis+Sp ...
 - 利用广播调用后台服务方法并根据方法返回的内容更新UI
			
一.UI布局代码 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...
 - webuploader设置timeout
			
参考:http://www.codingwhy.com/view/841.html 备注下!
 - excel转换html
			
利用POI解析excel,转换成html,支持各种版本的excel.支持自定义样式.支持行列合并 需要用到的jar public class Excel2Html { /** * 读取Excel并转换 ...