1. 作用域

  1. 通过var定义的变量,作用域是整个封闭函数,是全域的 。
  2. 通过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中,所有的声明(varfunctionletconstclassfunction\*)都会存在变量提升,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. letfor循环配合

for(let i = 0; i < 5 ; i++ ){
setTimeout(function(){
console.log(i) // 0 1 2 3 4
},1000)
}

此时打印出的结果为0 1 2 3 4 ,letfor循环使用时,其作用域是(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的区别(详解)的更多相关文章

  1. ES6 新增声明变量的 var let const 的区别详解

    var 如果使用关键字 var 声明一个变量,那么这个变量就属于当前的函数作用域,如果声明是发生在任何函数外的顶层声明,那么这个变量就属于全局作用域. let 1.let 声明的变量具有块作用域的特征 ...

  2. javascript中=、==、===区别详解

    javascript中=.==.===区别详解今天在项目开发过中发现在一个小问题.在判断n==""结果当n=0时 n==""结果也返回了true.虽然是个小问题 ...

  3. Go学习——new()和 make()的区别详解(转载)

    这篇文章主要介绍了Go语言中new()和 make()的区别详解,本文讲解了new 的主要特性.make 的主要特性,并对它们的区别做了总结,需要的朋友可以参考下 概述 Go 语言中的 new 和 m ...

  4. JQ的offset().top与js的offsetTop区别详解

    一.前言 最近在做一个图片懒加载的插件,就纵轴(Y轴)而言,我需要时时获取图片的上偏移量,好判断是否已进入视图区域,而我所理解的是offsetTop应该是跟offset().top一样的,然后陷入了因 ...

  5. jQuery height()、innerHeight()、outerHeight()函数的区别详解

    参考来源:http://www.jb51.net/article/84897.htm 代码示例(可复制到编辑器直接打开): <!DOCTYPE html> <html lang=&q ...

  6. JQ的offset().top与JS的getBoundingClientRect区别详解,JS获取元素距离视窗顶部可变距离

     壹 ❀ 引 我在 JQ的offset().top与js的offsetTop区别详解 这篇博客中详细分析了JQ方法offset().top与JS属性offsetTop的区别,并得出了一条offset( ...

  7. 基于Java的打包jar、war、ear包的作用与区别详解

      本篇文章,小编为大家介绍,基于Java的打包jar.war.ear包的作用与区别详解.需要的朋友参考下   以最终客户的角度来看,JAR文件就是一种封装,他们不需要知道jar文件中有多少个.cla ...

  8. Android中Intent传值与Bundle传值的区别详解

    Android中Intent传值与Bundle传值的区别详解 举个例子我现在要从A界面跳转到B界面或者C界面   这样的话 我就需要写2个Intent如果你还要涉及的传值的话 你的Intent就要写两 ...

  9. php 去除html标记--strip_tags与htmlspecialchars的区别详解

    php 去除html标记--strip_tags与htmlspecialchars的区别详解 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-26   本篇文章是对php中去除html ...

随机推荐

  1. 新浪微博error:redirect_uri_mismatch的解决方法 [

  2. (转)新ITC提交APP常见问题与解决方法(Icon Alpha,Build version,AppIcon120x120)(2014-11-17)

    1)ICON无法上传,提示图片透明(有Alpha通道) 苹果现在不接受png里的Alpha了,提交的图标带有Alpha通道就提示: 简单处理:用自带的预览打开,导出时不勾选Alpha,仍保存为png格 ...

  3. BZOJ 1007 [HNOI2008]水平可见直线 ——计算几何

    用了trinkle的方法,半平面交转凸包. 写了一发,既没有精度误差,也很好写. #include <map> #include <ctime> #include <cm ...

  4. request.getContextPath是为了解决相对路径的问题,可返回站点的根路径

    假定你的web application 名称为news,你在浏览器中输入请求路径: http://localhost:8080/news/main/list.jsp 则执行下面向行代码后打印出如下结果 ...

  5. spring mvc 单元测试示例

    import java.awt.print.Printable; import java.io.IOException; import javax.servlet.http.HttpServletRe ...

  6. K-th Number(poj 2104)

    题意:静态第K大 #include<cstdio> #include<iostream> #include<cstring> #define N 200010 #d ...

  7. 【SPOJ687&POJ3693】Maximum repetition substring(后缀数组)

    题意: n<=1e5 思路: From http://hzwer.com/6152.html 往后匹配多远 r 用ST表求lcp即可...往前 l 就把串反过来再做一下.. 但是有可能求出来的最 ...

  8. python结构语句(while,if)

    一.基础语法 编码: 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串 #!/usr/bin/env python # -*- coding:utf- ...

  9. Redis对象的设计与实现

    一.Redis对象结构Redis中的每个对象都由一个redisObject结构表示: typedef struct redisObject { unsigned type;//类型 unsigned ...

  10. android 活动

    一.Activity 声明周期 1 创建 把页面上的个元素加载到内存 onCreate 2 开始 把页面显示到屏幕 onStart 3 恢复 让页面在屏幕活动 onResume 4 暂停 停止页面动作 ...