var, let, const
a = 1
var a = 1
let a = 1
const a = 1
a=1 声明了一个全局变量是错的
a = 1
console.log(window.a)
// 声明了一个全局变量
var a
function f1(){
    var a
    functon f2(){
        a = 1 // 如果函数外有声明过 a 的话该表达式不会声明一个全局变量
    }
}
f1()
a = 1 含义不明,不建议用。
var a = 1
var 会变量提升
function fn(){
    if(true){
        console.log(a) // undefined 不会报错
    }else{
        var a
        console.log(2)
    }
}
fn()
function x(){
    var a = 1
    window.frank = function(){
        console.log(a)
    }
}
// 目的:只暴露 frank 一个全局变量
// 但函数名 x 也是一个全局变量
// 隐藏了 a 变量
立即执行函数(IIFE)
(function(){
    var a = 1
    window.frank = function(){
        console.log(a)
    }
}())
// 目的:只暴露 frank 一个全局变量
// 隐藏了 a 变量
let
方便地使用局部变量而且不需要引入一个函数。
{
    let a = 1
    window.frank = function(){
        console.log(a)
    }
}
console.log(a) // 报错
块级作用域
{
    let a = 1
}
console.log(a) // 报错
{
    var a = 1
}
console.log(a) // 1
{
    let a = 1
    {
        let a = 2
        {
            let a = 3
            console.log(a) // 3
        }
    }
}
{
    let a = 1
    {
        let a = 2
        {
            console.log(a) // 报错
            let a = 3
        }
    }
}
- 
    
let 的作用域在两个花括号{}之间
 - 
    
在 let a 之前使用a ,报错
 - 
    
如果重复 let a ,报错
 
const
const a = 2
a = 3 // 报错
- 
    
const 的作用域在两个花括号{}之间
 - 
    
在 const a 之前使用a ,报错
 - 
    
如果重复 const a ,报错
 - 
    
只有一次赋值机会,而且必须在声明时赋值
 
小题
var a = 1
function fn(){
    console.log(a)
}
a = 2
fn() // 2
for(var i = 0; i < 6; i++){
}
console.log(i) // 6
var i
for(i=0;i<6;i++){
    function fn(){
        console.log(i)
    }
    fn() // 1,2,3,4,5 
}
console.log(i) // 6
var i
for(i=0;i<6;i++){
    function fn(){
        console.log(i)
    }
    button.onclick = fn // 6 
}
console.log(i) // 6
面试题
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
</ul>
var liTags = document.querySelectorAll('li')
for(var i = 0;i <liTags.length;i++){
    liTags[i].onclick = function(){
        console.log(i) // 点击任何一个 li 都返回最后一个 i+1,即 liTags.length
    }
}
解决方法一:
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(var i = 0;i <liTags.length;i++){
    (function(){
        var j = arguments[0]
        liTags[j].onclick = function(){
            console.log(j)
        }
    })(i)
}
var liTags = document.querySelectorAll('li')
for(var i = 0;i <liTags.length;i++){
    (function(j){
        liTags[j].onclick = function(){
            console.log(j)
        }
    })(i)
}
解决方法三:
let 的魔法
var liTags = document.querySelectorAll('li')
for(let i = 0;i <liTags.length;i++){
    liTags[i].onclick = function(){
        console.log(i)
    }
}