es6 var、const 笔记

声明一个变量:

  • a = 1
  • var a = 1
  • let a = 1
  • const a = 1

一、a =1

a = 1 会声明一个全局变量 //错
a = 1会在没有函数的时候声明一个全局变量 //对

如果有两层函数 可能使用 局部变量

var a 
function fn(){
    var a //局部变量
    function fn2(){
        a = 1 //局部变量赋值为1
    }
}

如果当前有a 就直接利用这个a
如果当前没有a 就去 声明一个全局变量a

只有在没有全局变量a 的情况下
js才会隐式的声明一个全局变量
如果有a 就直接用那个a

二、var a =1

var 有声明提升 所有 var a = 1 放到最上面

function foo(){
     if(true){
      console.log(a)
     }else{
      var a
      console.log(2)
     }
}
foo()
//undefined
三、let a =1

let 声明一个 变量
必须先声明 后使用
let 有临时死区 Temp Dead Zone 没有声明就用就直接报错

let 的作用域 为 最近的{} 之间 只看{}
不能重复声明
不会变位置

var a 
{
    a = 1
    window.frank = function(){
        console.log(a)
    }
}

如果我不想暴露变量a 只想暴露 frank一个全局变量
var a = 1 ,就会不小心 暴露 window.a 这个全局变量

想有独立的作用域 可以用函数包起来啊
函数有函数名 这样会暴露 window.函数名 这个全局变量

立即执行函数

(function(){
    var a = 1
    window.frank = function(){
        console.log(a)
    }
})()

使用let
let 可以方便的使用局部变量,而不需要引入一个函数

{
    let a = 1
    window.frank = function(){
        console.log(a)
    }
}
四、const a =1

只有一次赋值机会,后面你再赋值就报错
const 声明一个 常量
包括 let 所有的用法
只能赋值一次 而且在声明的时候就立马赋值

总结

let 的作用域在最近的{}之间
如果在let a 之前使用a 报错
如果你重复let a 报错
const 同上
const 只有一次赋值
let 解决了var的所有弊端 不要用var 用let
如果你觉得这个变量不会再赋值 那你就用const

var litags = document.querySelectorAll('li')

for(var i = 0; i < litags.length; i++){
    (function(j){
        var j = i
            litags[j].onclick = function(){
                console.log(j)
            }
    })(i)
    
}
var litags = document.querySelectorAll('li')

for(var i = 0; i < litags.length; i++){
    let j = i
    litags[j].onclick = function(){
        console.log(j)
    }
}
var litags = document.querySelectorAll('li')

for(let i = 0; i < litags.length; i++){
    //块里面的i = 圆括号里面的i的值   js自动执行
    litags[i].onclick = function(){
        console.log(i)
    }
    //圆括号里面i的值 = 块里面的i
}//魔法

你可能感兴趣的:(es6 var、const 笔记)