let与const认识

 

es2015之前

在es2015之前JavaScript并没有块级作用域这个说法,只有全局和函数级的变量,let的出现使JavaScript语言有了块级作用域

在外面访问


{
var a=5; let b=10; } console.log(a,b);//a=5 b=undefined

在里面访问

{
  var a=5;
  let  b=10;  
 {
  console.log(a,b);//a=5 b=12
  }  
}

泄密

for(var i=0; i<5; i++){};
console.log(i)//i=5

for(var i=0; i<5; i++){};
console.log(i)//i=undefined

提升

使用var声明的变量会提升,而使用let声明的变量不会提升

function f(){
  console.log(a);   
  var a=5;
  
  /*等价于
  var a;
  console.log(a);
  a=5;*/
}
 f()//a=undefined


function f(){
  console.log(a);   
  let a=5;
}
 f()//a is not defined

代替立即执行匿名函数

var config = (function(){
       var config = [];
       config.push(1);
       config.push(2);
       config.push(3);
       return config;
})();


let config;
{
  config = [];
  config.push(1);
  config.push(2);
  config.push(3);  
}

 在严格模式(use strict)下运行函数不会被提升

function a(){console.log(1);}
function f(){
  a();
  if(false){
          function a(){console.log(2)}
  }
}

//这段代码在非严格模式下运行会打印出2,在严格模式下运行会打印出1
  • 实例例子
var arr= [];

function f(){
   for(var i=0; i<5; i++){
      arr.push(function(){
          console.log(i);
      })
  }  
}

f();

arr[3]()//5
arr[4]()//5
arr[1]()//5

想要执行出想要的结果arr[x]()//x就必须用到let

var arr= [];

function f(){
   for(let i=0; i<5; i++){
      arr.push(function(){
          console.log(i);
      })
  }  
}

f();

arr[3]()//3
arr[4]()//4
arr[1]()//1

在es2015之前您必须这样做

var arr= [];

function f(){
   for(var i=0; i<5; i++){
      arr.push((function(i){
          return function(){
                console.log(i);
          }
      })(i))
  }  
}

f();

arr[3]()//3
arr[4]()//4
arr[1]()//1
原文地址:https://www.cnblogs.com/fuzhengyi/p/7954982.html