声明一个变量:
- 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
}//魔法