1. 变量(全局 和 局部)
关于--变量提升:
var声明的变量有变量提升,会提升到全局或者当前函数体的顶端
Es6的提出块级作用域的概念,let和const存在TDZ临时死区概念,不存在变量提升
Example:
function test() {
//TDZ临时死区开始
console.log(a) // a is not defined!
//TDZ临时死区结束
let a;
console.log(a) //undefined
}
test()
2. 关于变量报错时,是undefined还是is not defined
Example:
console.log(a) //undefined
console.log(b)// error: b is not defined!
var a;
3. 函数表达式的两种形式:
a. 函数表达式:var a = function (){}
注意:当var a的表达式与之前声明的变量同名时,会将之前的变量覆盖。
b. 函数声明:function test() {}
4. 同名变量会覆盖:
Example:
var a = 10;
function test() {
var a = 20;
return function(){
a= 30
console.log(a)//30
}
}
test()();
5. 闭包的问题:
答案:遍历数组list时,把i分别等于01234时的值,保留在闭包中,当执行click事件时,确定取的是哪个闭包的值。
解法一:
var list = document.getElementsByTagName('li')
for(var i = 0; i < list.length; i ++) {
list[i].addEventListener('click', function(i) {
return function() {
alert(i +1)
}
}(i),true)
}
解法二:
for(var i = 0; i < list.length; i ++) {
let a = i //下标保存到块级作用域中
list[i].οnclick=function(){
alert(a+1)
}
}