var, let ,const区别

  es6新增了let和const新命令,用于变量的声明,这两个和es5的var存在着差异,而且let和const也有着一些区别,既然他两是es6新增的方法那就有他们的独特之处,让我们来看看一看吧.

  首先我们得先了解var的作用,var声明的变量可以改变,而且需要初始值否则会报undefined,这里存在着变量提升

``js
 var a = 1;
 console.log(a)//a:1
 function outPut(){
 var a= 4;
 console.log(a)//a:4
}
outPut()
console.log(a)//a:4``jsconsole.log(b)//undefinedvar b = 1;                                                                                      

  知道了var之后我们来了解下let和const的特性吧,var和let/const比较如下

  1.块级作用域

  2.不存在变量提升

  3.暂时性死区

  当初不是很明白为什么需要块级作用域,往往代码比文字更有说服力

function f1() { let n = 5; if (true) { let n = 10; console.log(n); // 10 内层的n } console.log(n); // 5 当前层的n }

  这样就很好的解决了全局变量污染的问题了

  再来个给力的栗子,你就更加明白了var和let的区别了,如下

 // var
    for(var i=0;i<5;i++){
           setTimeout(function(){
               console.log("var:" + i);//5,5,5,5,5
          })
    }

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

  这样是不是就明白了let和var的区别呢,那在es6之前如何解决这个问题的呢,那我们得使用闭包了

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

  现在我们来了解下暂时性死区和不存在变量提升,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量

var tmp = 123; // 声明
if (true) {
  tmp = ‘abc‘; // 报错 因为本区域有tmp声明变量
  let tmp; // 绑定if这个块级的作用域 不能出现tmp变量
}

  暂时性死区和不能变量提升的意义在于:

  为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为

  最后我们来聊一聊const吧,

  1.声明时候必须赋值

let p; var p1; // 不报错
const p3 = ‘马上赋值‘
const p3; // 报错 没有赋值

  2.const一旦声明值就不能改变,const所说的一旦声明值就不能改变,实际上指的是:变量指向的那个内存地址所保存的数据不得改动

  这些都是借鉴大佬的文章方便自我学习已经复习的

  

  

原文地址:https://www.cnblogs.com/Tonyhao/p/11273591.html

时间: 2024-11-05 19:40:22

var, let ,const区别的相关文章

jacript var let const 区别

代码片段1: var xx = 1 var xx = 2 console.log(xx) output: 2 代码片段2: let xx = 3; let xx = 4; console.log(xx) output:报错,提示重复定义 xx 正确: let xx = 3; xx = 4; console.log(xx) 第二个let 去掉,也就是说 代码片段3: const xx = 5; const xx = 6 或者 const xx = 5 xx = 6; 都报错: 正确的只能定义且赋值

var/let/const区别何在??

原文地址:http://www.cnblogs.com/liuhe688/p/5845561.html let和const有很多相似之处,先说一说let吧. 1. let添加了块级作用域 我们知道,JavaScript是没有块级作用域的,如果在块内使用var声明一个变量,它在代码块外面仍旧是可见的: if (true) { var foo = 3; } console.log(foo); // 3 for (var i = 0; i < 9; i++) { var j = i; } consol

var let const 的区别

Var let const 的区别 1.Var 定义的变量存在变量提升,而了let和const不存在变量提升.即在定义的变量代码上使用该变量,var的会输出undefined,而let的会报错. 2.var不存在暂时性死区,而let存在,只要块级作用域内存在let,它所声明的变量就绑定了这个区域,不在受外部的影响 例如:var tem=123: if(true){ tem='abc';   //报错 ReferenceError,因为在if里声明了let,形成了自己的作用域,外部的访问不到,所以

javascript精雕细琢(一):var let const function声明的区别

目录 引言 一.var 二.let 三.const 四.function 五.总结 引言 在学习javascript的过程中,变量是无时无刻不在使用的.那么相对应的,变量声明方法也如是.变量是由自己决定,但变量声明方法是早已经定义好的.那么在使用变量之前,了解变量声明方法,就变得尤为重要.在ES6推出之前,最常用的声明变量方法就是var.但是由于var自身的缺陷,ES6推出了let和const替代var.虽然修正了var的缺陷,但不能改变的,是之前已经用var写了多少年的项目,这些项目是无法随着

var、const、let 的区别

定义变量的三种方式 var.const.let 都可以用来定义变量,但三者之间存在区别. var var 声明变量的时候无需初始化. var 声明的变量可在后面进行修改. var 声明的全局变量可以被函数修改. <!DOCTYPE html> <html> <head> <title></title> </head> <body> <script type="text/javascript">

ES6和ES5变量声明的区别(var let const)

// es5的语法与es6的语法区别 // var let const console.log(name);//undefine,不会报错,因为变量声明会提到作用域的最前面 var name="aa"; for(var i=1;i<7;i++){ console.log(i); } console.log(i);//8,不会报错因为var声明的变量没有块级作用域 /** * 总结 var 声明的变量,声明语句会提到作用域的最前面,并且没有块级作用域 */ console.log(

JavaScript 中const、var、let 区别和使用

前言 我们对JS并不陌生,在使用JS的过程中.我们常常会使用var.const.Let声明变量. 以下总结这三者的区别以及使用的场景. 1.Const const定义的变量是不可以修改的,并且需要注意的是必须初始化.示例代码如下: const a = 1; console.log('函数外const定义a:'+a);//输出有值 a = 2 console.log('函数外修改const定义a:'+a);//输出报错 2.var var 定义的变量是可以修改的,如果不初始化会输出undefine

ES6中var/let/const的区别

最近无聊看了一下前端面试题,看到不少地方要求列出var/let/const的异同,自己整理一下,算加深一下记忆. 1.作用域 var为全局作用域,而let和const为局部作用域(仅作用在大括号内),举个简单例子: 1 if(true){ 2 var a = 1 3 let b = 2 4 const c = 3 5 } 6 console.log(a) //a打印出来为 1 7 console.log(b) //b is not defined 8 console.log(c) //c is

let、var、const的区别

先看let和var: 1. console.log(a); // undefined var a = 3; console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization let a = 3; 在当前代码执行之前,首先会把所有带var关键字的进行声明(带function关键字的也会提前声明并且定义),即所谓的变量提升,let则不存在这种情况. ps:项目中创建函数,一般都是基于函数表达式来实现